不同继承方式下对象的模型(带虚函数的)
我们采用比较的方式深入理解不同继承方式下的对象模型
A>①单继承(不带虚函数)
②单继承(带虚函数)
B>①多继承(不带虚函数)
②多继承(带虚函数)
C>①菱形继承/砖石继承(不带虚函数)
②菱形继承/砖石继承(带虚函数)
D>①虚拟继承(不带虚函数)
②虚拟继承(带虚函数)
E>①菱形虚拟继承(不带虚函数)
②菱形虚拟继承(带虚函数)
总结:
- 派生类重写基类的虚函数实现多态.
- 基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性
- 如果在类外定义虚函数,只能在声明函数时加virtual,定义处不加
- 不要在构造函数或者析构函数中调用虚函数,因为此时有可能对象不完整,可能会出现未定义的行为
- 最好将析构函数给成虚函(构成重写,避免释放派生类对象时调用了基类析构,从而出现内存泄漏)
- 虚表是所有类对象实例共用的
哪些函数不能定义为虚函数?
- 静态成员函数和普通的成员函数
类的静态成员函数没有this指针,调用函数也不需要通过对象来调,而虚函数需要通过对象来找虚表的.
- 友元函数
友元函数不属于类的成员函数,不能使用virtual
- 构造函数
构造函数的存在是初始化对象,而虚函数是需要对象去完成虚表的查找的,两者矛盾.
- 赋值运算符
赋值运算符可以定义为虚函数,但不建议这样做
基类=基类 和 派生类=派生类 无法构成重写,参数列表不同.
基类=派生类 不是虚函数也可以完成
派生类=基类 不符合赋值兼容规则