面试题答案
一键面试菱形继承问题
在传统的继承结构中,如果存在菱形继承,会导致数据冗余和二义性问题。例如:
class A {
public:
int data;
};
class B : public A {};
class C : public A {};
class D : public B, public C {};
在上述代码中,D
类从 B
和 C
继承,而 B
和 C
又都从 A
继承,这就形成了菱形继承。此时 D
类中会有两份 A
类的数据成员 data
,造成数据冗余。并且当访问 data
时,会出现二义性,因为编译器不知道应该访问从 B
继承来的 data
还是从 C
继承来的 data
。
虚基类解决方法
虚基类通过让 B
和 C
以虚继承的方式从 A
继承,这样在 D
类中只会保留一份 A
类的数据成员,从而解决数据冗余和二义性问题。代码示例如下:
class A {
public:
int data;
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
在上述修改后的代码中,B
和 C
以 virtual public A
的方式继承 A
,D
类中就只会有一份 A
类的数据成员 data
。此时访问 data
不会再出现二义性,并且也解决了数据冗余问题。例如:
#include <iostream>
int main() {
D d;
d.data = 10;
std::cout << "d.data: " << d.data << std::endl;
return 0;
}
这段代码可以正确输出 d.data
的值,不会出现数据冗余和二义性问题。