面试题答案
一键面试- 场景一:多个基类有同名成员
- 描述:当一个派生类从多个基类继承,且这些基类中有同名的成员(函数或数据成员)时,就会产生二义性。例如:
class Base1 {
public:
int value;
};
class Base2 {
public:
int value;
};
class Derived : public Base1, public Base2 {
};
在Derived
类中,如果试图访问value
,编译器无法确定是访问Base1
中的value
还是Base2
中的value
,从而产生二义性。
- 解决方法:
- 指定作用域:在访问成员时明确指定基类作用域。例如:
Derived d;
d.Base1::value = 1;
d.Base2::value = 2;
- **在派生类中重定义**:在`Derived`类中重新定义`value`,屏蔽基类中的同名成员。例如:
class Derived : public Base1, public Base2 {
public:
int value;
};
- 场景二:菱形继承
- 描述:菱形继承是一种特殊的多继承情况,当一个类从两个类继承,而这两个类又继承自同一个基类时,会出现菱形结构,导致数据成员的重复继承和二义性。例如:
class Base {
public:
int data;
};
class Middle1 : public Base {
};
class Middle2 : public Base {
};
class Derived : public Middle1, public Middle2 {
};
在Derived
类中访问data
成员时,会出现二义性,因为Derived
类从Middle1
和Middle2
间接继承了两份Base
类的data
成员。
- 解决方法:
- 使用虚继承:在继承路径中,让中间层类(
Middle1
和Middle2
)虚继承自Base
类。例如:
- 使用虚继承:在继承路径中,让中间层类(
class Base {
public:
int data;
};
class Middle1 : virtual public Base {
};
class Middle2 : virtual public Base {
};
class Derived : public Middle1, public Middle2 {
};
这样在Derived
类中就只会有一份Base
类的数据成员,避免了二义性。