面试题答案
一键面试菱形继承可能引发的问题
- 数据冗余:假设存在类
A
,类B
和C
都继承自A
,类D
又同时继承自B
和C
。这样D
中会存在两份A
类的数据成员,造成空间浪费。 - 歧义性:当
D
调用A
中的成员函数或访问成员变量时,由于B
和C
都继承了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;
}
在上述代码中,B
和C
虚继承自A
,这样D
中只会有一份A
的数据成员data
,避免了数据冗余和访问歧义问题。