类-多重继承中的重大缺陷(使用虚继承解决)
#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;
}
-
解决方案
使用虚基类和虚继承.(virtual)
#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; }
尽量不要使用多重继承(多继承)