面试题答案
一键面试展示二义性的代码
#include <iostream>
class X {
public:
int data;
};
class Y : public X {};
class Z : public X {};
class W : public Y, public Z {};
int main() {
W w;
// 以下代码会产生二义性错误
// w.data = 10;
return 0;
}
消除二义性的方法及原理
1. 使用作用域运算符指定路径
原理:明确告诉编译器从哪个父类路径去访问成员变量,从而消除歧义。
#include <iostream>
class X {
public:
int data;
};
class Y : public X {};
class Z : public X {};
class W : public Y, public Z {};
int main() {
W w;
w.Y::data = 10;
std::cout << "通过Y路径访问data: " << w.Y::data << std::endl;
w.Z::data = 20;
std::cout << "通过Z路径访问data: " << w.Z::data << std::endl;
return 0;
}
2. 使用虚继承
原理:虚继承使得从不同路径继承过来的同名成员变量在派生类中只有一份拷贝,避免了因多份拷贝导致的访问歧义。
#include <iostream>
class X {
public:
int data;
};
class Y : virtual public X {};
class Z : virtual public X {};
class W : public Y, public Z {};
int main() {
W w;
w.data = 10;
std::cout << "虚继承后访问data: " << w.data << std::endl;
return 0;
}