虚基类

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

 

 

#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)

小结:

尽量不要使用多重继承(多继承)

posted @ 2020-06-03 11:14  CollisionDimension  阅读(119)  评论(0)    收藏  举报