面试题答案
一键面试虚基类的作用
在C++复杂继承结构中,虚基类主要用于解决菱形继承带来的问题。当一个派生类从多个基类继承,而这些基类又有共同的基类时,若不使用虚基类,会导致共同基类的数据在派生类对象中出现多次,造成数据冗余;同时,对共同基类成员的访问可能会产生二义性。虚基类使得共同基类在派生类对象中只保留一份实例,避免了数据冗余,并且明确了对共同基类成员的访问路径,解决了二义性问题。
解决菱形继承的数据冗余和二义性问题示例
#include <iostream>
// 定义基类A
class A {
public:
int value;
A(int v) : value(v) {}
};
// 定义类B,以虚基类方式继承A
class B : virtual public A {
public:
B(int v) : A(v) {}
};
// 定义类C,以虚基类方式继承A
class C : virtual public A {
public:
C(int v) : A(v) {}
};
// 定义类D,继承自B和C
class D : public B, public C {
public:
D(int v) : A(v), B(v), C(v) {}
void printValue() {
std::cout << "Value: " << value << std::endl;
}
};
int main() {
D d(10);
d.printValue();
return 0;
}
在上述代码中:
- 数据冗余:通过
virtual public A
的继承方式,使得A
在D
对象中只存在一份value
成员,避免了如果不使用虚基类时value
成员可能出现两份(一份来自B
,一份来自C
)的冗余情况。 - 二义性:当
D
对象访问value
成员时,由于虚基类的存在,只有一份value
,不存在从B
和C
继承的两份value
导致的访问二义性问题,D
可以直接访问value
成员。