MST

星途 面试题库

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

请阐述在C++中,虚基类是如何解决菱形继承带来的数据冗余和二义性问题的,并通过简单代码示例说明。
31.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

菱形继承问题

在传统的继承结构中,如果存在菱形继承,会导致数据冗余和二义性问题。例如:

class A {
public:
    int data;
};

class B : public A {};
class C : public A {};

class D : public B, public C {};

在上述代码中,D 类从 BC 继承,而 BC 又都从 A 继承,这就形成了菱形继承。此时 D 类中会有两份 A 类的数据成员 data,造成数据冗余。并且当访问 data 时,会出现二义性,因为编译器不知道应该访问从 B 继承来的 data 还是从 C 继承来的 data

虚基类解决方法

虚基类通过让 BC 以虚继承的方式从 A 继承,这样在 D 类中只会保留一份 A 类的数据成员,从而解决数据冗余和二义性问题。代码示例如下:

class A {
public:
    int data;
};

class B : virtual public A {};
class C : virtual public A {};

class D : public B, public C {};

在上述修改后的代码中,BCvirtual public A 的方式继承 AD 类中就只会有一份 A 类的数据成员 data。此时访问 data 不会再出现二义性,并且也解决了数据冗余问题。例如:

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

这段代码可以正确输出 d.data 的值,不会出现数据冗余和二义性问题。