MST

星途 面试题库

面试题:C++ 多重继承中的菱形继承问题及解决办法

在C++ 多重继承中,菱形继承可能会引发什么问题?请举例说明,并阐述如何使用虚继承来解决这些问题。
41.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

菱形继承可能引发的问题

  1. 数据冗余:假设存在类A,类BC都继承自A,类D又同时继承自BC。这样D中会存在两份A类的数据成员,造成空间浪费。
  2. 歧义性:当D调用A中的成员函数或访问成员变量时,由于BC都继承了A,编译器不知道应该使用从B继承过来的A部分还是从C继承过来的A部分,会产生歧义。

举例说明

#include <iostream>
class A {
public:
    int data;
};
class B : public A {};
class C : public A {};
class D : public B, public C {};

int main() {
    D d;
    // 以下代码会报错,因为存在歧义
    // d.data = 10; 
    return 0;
}

虚继承解决问题

通过虚继承,使得从不同路径继承过来的同名成员在派生类中只有一份拷贝。

代码示例

#include <iostream>
class A {
public:
    int data;
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};

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

在上述代码中,BC虚继承自A,这样D中只会有一份A的数据成员data,避免了数据冗余和访问歧义问题。