MST
星途 面试题库

面试题:C++ 虚基类在菱形继承中的作用

请描述C++中菱形继承会出现什么问题,虚基类是如何解决这些问题的?请结合代码示例说明。
48.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

菱形继承的问题

  1. 数据冗余:在菱形继承中,从最顶层基类继承下来的数据成员会在多个派生类中重复出现,导致数据冗余。例如,假设有类A,类BC都继承自A,类D又同时继承自BC。这样D中就会有两份从A继承来的数据成员。
  2. 二义性:当在类D中访问从A继承来的成员时,会出现二义性。因为编译器不知道应该使用从B继承来的那份A成员,还是从C继承来的那份A成员。

虚基类解决问题的方式

虚基类通过让多个派生类共享一份基类的成员,避免了数据冗余和二义性问题。当使用虚基类时,在最终派生类中只会存在一份虚基类的成员。

代码示例

#include <iostream>

class A {
public:
    int data;
    A() : data(0) {}
};

// B和C以虚继承的方式继承A
class B : virtual public A {};
class C : virtual public A {};

// D同时继承B和C
class D : public B, public C {};

int main() {
    D d;
    d.data = 10;
    std::cout << "d.data: " << d.data << std::endl;
    return 0;
}

在上述代码中,BC虚继承自AD继承自BC。这样D中只有一份A的成员data,避免了数据冗余。同时,在访问data时也不会出现二义性。