面试题答案
一键面试- 能否直接访问及原因:
- 在类 D 的成员函数中可以直接访问 m_value 。
- 原因是虚基类保证了在最终的派生类(这里是 D)中只存在一份虚基类(A)的子对象。当 B 和 C 以虚继承的方式从 A 派生,然后 D 多重继承自 B 和 C 时,A 的成员变量(包括 protected 的 m_value)对于 D 而言就如同直接从 A 派生一样,只要是通过虚继承的路径,在 D 的成员函数中就可以访问其 protected 成员。
- 若假设不能访问的访问方法(实际可以访问,但假设不可以的处理思路):
- 可以通过在类 A 中提供 public 或 protected 的访问函数(如 getValue 函数)来间接访问 m_value 。
class A { protected: int m_value; public: int getValue() const { return m_value; } }; class B : virtual public A {}; class C : virtual public A {}; class D : public B, public C { public: void func() { int value = getValue();//通过 A 提供的访问函数访问 m_value } };