多继承的缺陷
例如:电话作为基类,座机类和手机类继承电话类,最后无线座机同时继承座机类和手机类,示意图如下:
示例代码:
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
// 电话类
class Tel {
public:
Tel() {
this->number = "未知";
}
protected:
string number; //电话号码;
};
// 座机类
class FixedLine : public Tel {
};
// 手机类
class MobilePhone :public Tel {
};
// 无线座机
class WirelessTel :public FixedLine, public MobilePhone {
public:
void setNumber(const char *number) {
//this->number = number; //错误, 指定不明确
this->FixedLine::number = number; //this可以省略
}
string getNumber() {
//return MobilePhone::number;
return MobilePhone::number;
}
};
int main(void) {
WirelessTel phone;
phone.setNumber("13243879166");
cout << phone.getNumber() << endl; //打印未知
system("pause");
return 0;
}
执行结果:
解决这种获取电话号码未知情况的方法是使用虚基类和虚继承:
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
// 电话类
class Tel { //虚基类
public:
Tel() {
this->number = "未知";
}
protected:
string number; //电话号码;
};
// 座机类
class FixedLine : virtual public Tel { //虚继承
};
// 手机类
class MobilePhone : virtual public Tel { //虚继承
};
// 无线座机
class WirelessTel :public FixedLine, public MobilePhone {
public:
void setNumber(const char *number) {
this->number = number; //直接访问number
}
string getNumber() {
return this->number; //直接访问number
}
};
int main(void) {
WirelessTel phone;
phone.setNumber("13243879166");
cout << phone.getNumber() << endl;
system("pause");
return 0;
执行结果:
这个被共享的基类(Tel)就称为虚基类。