C++:多态

多态成立三个条件:
1、要有继承
2、要有虚函数重写
3、用父类指针(父类引用)指向子类对象

静态联编和动态联编:
1、C++与C相同,是静态编译型语言
2、在编译时,编译器自动根据指针的类型判断指向的是一个什么样的对象;所以编译器认为父类指针指向的是父类对象。
3、由于程序没有运行,所以不可能知道父类指针指向的具体是父类对象还是子类对象
从程序安全的角度,编译器假设父类指针只指向父类对象,因此编译的结果为调用父类的成员函数。这种特性就是静态联编。

虚析构函数
通过父类指针 释放所有的子类资源

在什么情况下应当声明虚函数
构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数
析构函数可以是虚的。虚析构函数用于指引 delete 运算符正确析构动态对象

多态原理
当类中声明虚函数时,编译器会在类中生成一个虚函数表
虚函数表是一个存储类成员函数指针的数据结构
虚函数表是由编译器自动生成与维护的
virtual成员函数会被编译器放入虚函数表中
当存在虚函数时,每个对象中都有一个指向虚函数表的指针(C++编译器给父类对象、子类对象提前布局vptr指针;当进行函数调用时,C++编译器不需要区分子类对象或者父类对象,只需要再base指针中,找vptr指针即可。)
VPTR一般作为类对象的第一个成员

构造的顺序是先构造父类、再构造子类
当调用父类的构造函数的时候,虚函数指针vfptr 指向父类的虚函数表
当父类构造完,调用子类的构造函数的时候,虚函数指针 vfptr 指向子类的虚函数表
结论:构造函数中无法实现多态

指针也是一种数据类型,C++类对象的指针p++/–,仍然可用。
指针运算是按照指针所指的类型进行的。
父类p++与子类p++步长不同;不要混搭,不要用父类指针++方式操作子类对象数组

纯虚函数和抽象类

纯虚函数和抽象类
纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本
纯虚函数为各派生类提供一个公共界面(接口的封装和设计、软件的模块功能划分)

纯虚函数说明形式:
virtual 类型函数名( 参数表) =0 ;

一个具有纯虚函数的基类称为抽象类。

你可能感兴趣的:(c++,多态,虚函数)