目录




传父类的指针或者引用

协变

析构函数的重写


virtual去掉同样完成重写。说明在普通场景下,析构函数是不是虚函数没有影响。若定义一个既可指向父类对象又指向子类对象的指针,不构成重写时,存在内存泄漏的问题

加上virtual构成虚函数后完成析构

子类不写virtual关键字

针对虚函数重写,尽量使用协变,严格按照重写要求来,这样代码更容易维护

不构成多态,就是按指针类型去调用的。构成多态,就是去对象虚表中去找的。
重载
函数重载是指在一个类中声明了多个名称相同但参数列表不同的函数,这些参数可能个数、顺序、类型不同,不能靠返回值类型来判断。
特征:
函数重写(也称覆盖)
函数重载是指子类重新定义基类的虚函数。
特征:
重定义(又称隐藏)
特征:



纯虚函数不只可以声明,还可以定义,但是没意义(即使定义实现出来也无从调用,体现了接口继承)

- // 1.我们增加一个派生类Derive去继承Base
- // 2.Derive中重写Func1
- // 3.Base再增加一个虚函数Func2和一个普通函数Func3
- class Base
- {
- public:
- virtual void Func1()
- {
- cout << "Base::Func1()" << endl;
- }
- virtual void Func2()
- {
- cout << "Base::Func2()" << endl;
- }
- void Func3()
- {
- cout << "Base::Func3()" << endl;
- }
- private:
- int _b = 1;
- };
- class Derive : public Base
- {
- public:
- virtual void Func1()
- {
- cout << "Derive::Func1()" << endl;
- }
- private:
- int _d = 2;
- };
- int main()
- {
- Base b;
- Derive d;
- return 0;
- }

以笔试题为例子

该对象除了包含int,char,还有一个指针,该指针用来实现多态


从反汇编的角度看虚表


虚表存储的区域
单继承中的虚函数表

写一个函数打印虚表,确认虚表中调用的函数

多继承中的虚函数表
