虚基类
一、多重继承在“菱形继承”中的重大缺点

#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;
}
检查:
添加命令行选项:
/d1 reportSingleClassLayoutWirelessTel

二、解决方案(使用虚基类和虚继承)
#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;
}
在Demo中,被共享的基类(Tel)就称为虚基类(Virtual Base Class)
小结:
尽量不要使用多重继承(多继承)

浙公网安备 33010602011771号