C++ 虚拟继承和非虚拟继承详解:区别、实现和注意事项
虚拟继承和非虚拟继承是 C++ 中两种不同的继承方式,它们在继承关系建立、对象内存布局、虚函数表维护、构造函数和析构函数调用顺序以及实现复杂度等方面存在显著差异。
- 继承关系的建立方式不同
非虚拟继承是最常见的继承方式,使用关键字 'public'、'private' 或 'protected' 将一个类派生出另一个类。而虚拟继承则通过关键字 'virtual' 来实现。
- 对象内存布局不同
非虚拟继承会将父类的成员变量直接嵌入到子类对象中。而虚拟继承则会在子类对象中保留一份指向父类对象的指针(虚表指针),通过该指针访问父类成员。
- 虚函数表的维护方式不同
虚拟继承会在子类对象中增加一个指向虚函数表的指针,而非虚拟继承中,虚函数表的指针仅存在于父类对象中。
- 构造函数和析构函数的调用顺序不同
在虚拟继承中,当一个类被多个类虚拟继承时,其构造函数和析构函数只会被调用一次。而在非虚拟继承中,每个基类都会调用一次构造函数和析构函数。
- 实现方式不同,虚拟继承更为复杂
虚拟继承需要额外维护虚表指针和虚函数表指针,实现起来比非虚拟继承更为复杂。同时,虚拟继承也更容易引发潜在的问题,如菱形继承问题。
原文地址: https://www.cveoy.top/t/topic/nGQW 著作权归作者所有。请勿转载和采集!