面试题答案
一键面试虚基类解决菱形继承问题的原理
在菱形继承中,若存在一个基类 A
,类 B
和 C
都继承自 A
,而类 D
又同时继承自 B
和 C
。这样 D
类中会存在两份 A
类的成员变量和函数副本,这不仅浪费内存,还可能导致命名冲突等问题。
虚基类的原理是,当使用虚基类时,从不同路径继承过来的同名成员在内存中只有一份拷贝。在 B
和 C
继承 A
时将 A
声明为虚基类,这样在最终的派生类 D
中,无论从 B
还是 C
路径继承,都共享同一份 A
的数据成员和成员函数,避免了数据冗余和命名冲突。
代码实现示例
#include <iostream>
// 定义虚基类 A
class A {
public:
int data;
A() : data(0) {}
};
// B 继承自 A 并将 A 声明为虚基类
class B : virtual public A {
public:
B() {}
};
// C 继承自 A 并将 A 声明为虚基类
class C : virtual public A {
public:
C() {}
};
// D 同时继承自 B 和 C
class D : public B, public C {
public:
D() {
data = 10;
}
};
int main() {
D d;
std::cout << "D 类对象中的 data 值: " << d.data << std::endl;
return 0;
}
在上述代码中,B
和 C
都以虚继承的方式继承 A
,所以 D
类对象中只存在一份 A
的 data
成员变量,通过 D
对象可以直接访问和修改 data
,不会出现歧义。