C++中的多态

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关键字,则可以析构子类对象的所有内存空间,这就叫虚析构函数。

原文地址:https://www.cnblogs.com/jswu-ustc/p/8391190.html