C++特征之多态

来源:互联网 发布:傻瓜视频制作软件 编辑:程序博客网 时间:2024/05/18 01:43

按值传递对象

#include <iostream>using namespace std;class person{public:    int sex;    virtual int love(){cout<<"person"<<endl;}    person(){cout<<"person construct"<<endl;}    virtual ~person(){cout<<"person destroy"<<endl;}};class Employee:public person{public:    int love(){cout<<"Employee"<<endl;}    Employee(){cout<<"Employee construct"<<endl;};    ~Employee(){cout<<"Employee destroy"<<endl;}};int main(){        //person a;        person().love();        Employee().love();}

运行结果:
person construct
person
person destroy
person construct
Employee construct
Employee
Employee destroy
person destroy

从结果可以看出:
1、person类中的love()定义为虚函数,通过声明一个匿名对象来调用love(),则那个类的匿名对象调用那个类的函数,虚函数没体现什么作用,这是多态中的“重定义“(不同对象调用各自类中同名函数)
2、程序运行时,先调用基类构造函数,再调用派生类的构造函数,若先生成派生类的对象,也是先调用积累的构造函数。而后是先析构基类,再析构派生类。
3、声明匿名对象,就是直接调用构造函数,系统自动生成一个对象,只在该代码行中有效,下一行就会被析构。


真正的虚函数是通过指针和引用进行调用的

#include <iostream>using namespace std;class person{public:    int sex;    virtual int love(){cout<<"person"<<endl;}    person(){cout<<"person construct"<<endl;}    virtual ~person(){cout<<"person destroy"<<endl;}};class Employee:public person{public:    int love(){cout<<"Employee"<<endl;}    Employee(){cout<<"Employee construct"<<endl;};    ~Employee(){cout<<"Employee destroy"<<endl;}};int main(){    person* p=new Employee;    p->love();    p->love();    delete p;}

运行的结果:
person construct
Employee construct
Employee
Employee
Employee destroy
person destroy

调用的函数的是派生类中的love(),基类中的love()被覆盖了。

但要把指针指向的在自由存储空间构造的对象类型更改:

person* p=new person;

则结果为:
person construct
person
person
person destroy

都没有构造Employee对象


BUT 把virtual去掉后

#include <iostream>using namespace std;class person{public:    int sex;    int love(){cout<<"person"<<endl;}    person(){cout<<"person construct"<<endl;}    ~person(){cout<<"person destroy"<<endl;}};class Employee:public person{public:    int love(){cout<<"Employee"<<endl;}    Employee(){cout<<"Employee construct"<<endl;};    ~Employee(){cout<<"Employee destroy"<<endl;}};int main(){    person* p=new Employee;    p->love();    p->love();    delete p;}

运行的结果:
person construct
Employee construct
person
person
person destroy

调用的是基类(父类)中的love(),
在动态申请内存时候 在自由空间构造一个Employee类型的对象,并且返回了指向该对象父类类型的指针。

0 0