C++面向对象之多态(二)-----不同继承方式下对象的模型(不带虚函数VS带有虚函数)

不同继承方式下对象的模型(带虚函数的)

   我们采用比较的方式深入理解不同继承方式下的对象模型

A>①单继承(不带虚函数)


②单继承(带虚函数)


B>①多继承(不带虚函数)


②多继承(带虚函数)



C>①菱形继承/砖石继承(不带虚函数)


②菱形继承/砖石继承(带虚函数)

D>①虚拟继承(不带虚函数)


②虚拟继承(带虚函数)



E>①菱形虚拟继承(不带虚函数)

②菱形虚拟继承(带虚函数)


总结:

  • 派生类重写基类的虚函数实现多态.
  • 基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性
  • 如果在类外定义虚函数,只能在声明函数时加virtual,定义处不加
  • 不要在构造函数或者析构函数中调用虚函数,因为此时有可能对象不完整,可能会出现未定义的行为
  • 最好将析构函数给成虚函(构成重写,避免释放派生类对象时调用了基类析构,从而出现内存泄漏)
  • 虚表是所有类对象实例共用的

哪些函数不能定义为虚函数?

  • 静态成员函数和普通的成员函数

   类的静态成员函数没有this指针,调用函数也不需要通过对象来调,而虚函数需要通过对象来找虚表的.

  • 友元函数

   友元函数不属于类的成员函数,不能使用virtual

  • 构造函数

   构造函数的存在是初始化对象,而虚函数是需要对象去完成虚表的查找的,两者矛盾.

  • 赋值运算符

   赋值运算符可以定义为虚函数,但不建议这样做

   基类=基类  和 派生类=派生类 无法构成重写,参数列表不同.

   基类=派生类   不是虚函数也可以完成

   派生类=基类    不符合赋值兼容规则

    

猜你喜欢

转载自blog.csdn.net/sx2448826571/article/details/80952137