1.所谓多态是指:父类和子类具有同名函数fun(),当使用父类指针p指向父类对象时,调用p->fun()函数时,执行的是父类的fun()函数;当使用父类指针p指向子类对象时(类型兼容性原则允许这么做),调用p->fun()函数时,执行的还是父类的fun()函数。原因在于子类从父类那里继承了一个fun()函数,自己又定义了一个fun()函数,则实际上子类中有两个同名的fun()函数。而用父类指针指向子类对象,实际上指向的是子类对象中继承自父类的fun()函数。那么虽然父类指针p指向子类对象,调用p->fun()函数时,执行的实际上是继承自父类的fun()函数。 我们实际想要的功能是:当父类和子类中具有同名函数fun()时,如果父类指针指向父类对象,则执行父类的fun()函数;如果父类指针指向子类对象,则执行子类的fun()函数,这个功能就叫做多态。为了实现这个多态功能,我们需要在父类的fun()函数前面添加一个关键字virtual,子类中的fun()函数前面可以不加virtual关键字声明,但一般我们为了醒目,让阅读程序的人知道这里可以实现多态功能,子类的fun()函数前面也是加virtual关键字的,
以下代码是实现多态的实例:
1 #include<iostream> 2 using namespace std; 3 4 class Parent 5 { 6 public: 7 Parent(int _a):a(_a){} 8 void print(){cout<<"打印Parent类 a:"<<a<<endl;} 9 10 public: 11 int a; 12 }; 13 14 15 class Child:public Parent 16 { 17 public: 18 Child(int _a,int _a_,int _b):Parent(_a),a(_a_),b(_b){} 19 void print(){cout<<"打印Child类 b:"<<b<<endl;} 20 21 public: 22 int a; 23 int b; 24 }; 25 26 27 int main() 28 { 29 Child c(20,30,40); 30 31 Parent *base; 32 33 base=&c; 34 base->print(); 35 36 return 0; 37 }
第8行的print()函数前面没有加virtual关键字,所以上面的代码无法实现多态功能,代码的执行结果为:打印Parent类 a:20 可以看出,执行的是Child类中继承自Parent类的print()函数。
如果我们在第8行print(0函数的前面加上virtual关键字,则代码的执行结果是:打印Child类 b:40 这就实现了多态的功能
注意:基类的指针,无论如何只能指向基类的属性和方法,以及子类中和基类同名的方法(不包括子类中和基类同名的属性,因为属性没法声明成virtual的)。对于子类的属性,以及子类中和基类函数不同名的函数,基类指针都是无法调用的。
2.C++中面向对象编程的三大概念:
封装:突破了C中函数的概念,用类做函数参数的时候,可以同时使用对象的属性和方法;
继承:实现了代码的复用,可以使用以前的人写的代码;
多态:搭建了一个框架,定义好函数调用的接口,则后来人只要按照此框架写代码,函数的调用方法就不会改变,现在写的代码用同一种方法可以调用后来人写的代码,相当于使用未来...
3.实现多态的3个条件(适用于所有面向对象编程):
(1).要有继承;
(2).要有虚函数重写;
(3).用父类指针(或父类引用)指向子类对象
4.虚析构函数:
c++中有时希望通过指向父类的指针释放子类对象的内存空间,如果不将父类析构函数前面加virtual关键字,则只能释放子类中继承自父类的属性的内存空间;如果在父类的析构函数前面加上virtual关键字,则可以析构子类对象的所有内存空间,这就叫虚析构函数。