面试题答案
一键面试虚基类解决菱形继承问题的方式
在菱形继承中,若不使用虚基类,从最终派生类访问共同基类成员时会产生二义性,因为共同基类会在中间派生类中出现多次。使用虚基类时,虚基类子对象只有一份拷贝,被所有派生类共享。编译器通过特殊机制,确保在最终派生类对象布局中,虚基类子对象仅出现一次,避免了重复继承带来的问题。
实际代码应用场景举例
#include <iostream>
// 定义虚基类A
class A {
public:
int value;
A(int v) : value(v) {}
};
// 定义从A派生的B类,B以虚继承的方式继承A
class B : virtual public A {
public:
B(int v) : A(v) {}
};
// 定义从A派生的C类,C以虚继承的方式继承A
class C : virtual public A {
public:
C(int v) : A(v) {}
};
// 定义从B和C派生的D类
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;
}
在上述代码中,B
和C
类都以虚继承的方式继承A
类,D
类从B
和C
派生。这样在D
类对象中,A
类子对象只有一份,D
类对象可以无歧义地访问A
类的成员value
。如果B
和C
不以虚继承方式继承A
,D
类对象就会包含A
类的两份拷贝,访问value
时就会产生二义性。在实际应用中,如在图形类继承体系中,若有一个表示图形基本属性的基类,不同类型的图形(如圆形、矩形等)从该基类派生,又有一个更复杂的图形(如带阴影的圆形)从多个图形类派生,此时使用虚基类可避免基本属性的重复继承,优化内存布局,消除访问歧义。