这里最后是放自己的数据成员,但这里没有些,两张虚函数表
父亲类的母亲类的,那为什么父亲类在上面,主要还是看继承的顺序,里面的替换情况,是重写那个方法就替换那个方法,子类自己增加的虚函数,放在第一个继承表里面.指针式按步,类型用字节.访问虚函数表里面的内容需要找到vptr的地址,然后通过地址增加来打印出里面的内容
Final
进阶2:final
用来修饰类,让该类不能被继承
理解:使得该类终结!
class XiaoMi {
public:
XiaoMi(){}
};
class XiaoMi2 final : public XiaoMi {
XiaoMi2(){}
};
class XiaoMi3 : public XiaoMi2 { //不能把XiaoMi2作为基类
};
用来修饰类的虚函数,使得该虚函数在子类中,不能被重写
理解:使得该功能终结!
class XiaoMi { public: virtual void func() final; }; void XiaoMi::func() { //不需要再写final cout <<"XiaoMi::func"<<endl; } class XiaoMi2 : public XiaoMi { public: void func() {}; // 错误!不能重写func函数 }; |
进阶3:override
override仅能用于修饰虚函数。
作用:
- 提示程序的阅读者,这个函数是重写父类的功能。
- 防止程序员在重写父类的函数时,把函数名写错。
#include <iostream> using namespace std; class XiaoMi { public: virtualvoidfunc() { cout <<"XiaoMi::func"<<endl; }; }; class XiaoMi2 : public XiaoMi { public: voidfunc() override{} //void func() override; 告诉程序员func是重写父类的虚函数 //void func1() override{} 错误!因为父类没有func1这个虚函数 }; intmain(void) { XiaoMi2xiaomi; return 0; } |
override只需在函数声明中使用,不需要在函数的实现中使用。
- 项目精讲-遗失的子类析构函数
override是修饰虚函数的,override
消失的子类析构函数
子类虚构函数在调用的时候会被稀释掉了
创建一个类的目的就是需要使用对象,
纯虚函数,