面试题答案
一键面试菱形继承的问题
- 数据冗余:在菱形继承中,从最顶层基类继承下来的数据成员会在多个派生类中重复出现,导致数据冗余。例如,假设有类
A
,类B
和C
都继承自A
,类D
又同时继承自B
和C
。这样D
中就会有两份从A
继承来的数据成员。 - 二义性:当在类
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;
}
在上述代码中,B
和C
虚继承自A
,D
继承自B
和C
。这样D
中只有一份A
的成员data
,避免了数据冗余。同时,在访问data
时也不会出现二义性。