C++之多重继承

文章目录

cpp 复制代码
class 派生类名:继承方式 基类名1, 继承方式 基类名2,...{};
cpp 复制代码
#include <iostream>
using namespace std;
class Phone{
private:
    string m_number;
public:
    Phone(const string& number){
        m_number = number;
    }
    void call(const string& number){
        cout << m_number << "打给: " << number << endl;
    }
};
class Player{
public:
    Player(const string& media){
        m_media = media;
    }
    void play(const string& music){
        cout << m_media << "正在播放: " << music << endl;
    }
private:
    string m_media ; //播放器的名称
};
class Computer{
private:
    string m_os; //使用的操作系统
public:
    Computer(const string& os):m_os(os){
    }
    void run(const string& app){
        cout << "在" << m_os << "正在运行: " << app << endl;
    }
};
/*典型的多重继承*/
class SmartPhone:public Phone, public Player, public Computer{
public:
    SmartPhone(const string& number, const string& media, const string& os):Phone(number), Player(media),
    Computer(os){
        
    }
};
int main(void){
    SmartPhone huawei("13988888888", "MP4", "鸿蒙");
    huawei.call("010-12345");
    huawei.play("我和我的祖国");
    huawei.run("王者荣耀");
    return 0;
}

名字冲突

  • 当两个不同基类拥有同名成员时,容易产生名字冲突问题
  • 使用域限定符解决
cpp 复制代码
#include <iostream>
using namespace std;
class A{
public:
    void func(void){
        cout << "A::func()" << endl;
    }
};
class B{
public:
    void func(void){
        cout << "B::func()" << endl;
    }
};
class C: public A, public B{

};
int main(void){
    C test;
    test.A::func();
    return 0;
}

钻石继承(菱形继承)与虚继承

  • 钻石继承,一个派生类继承的多个基类又源自一个公共的祖先(公共基类)
cpp 复制代码
#include <iostream>
using namespace std;
class A{
protected:
    int m_data;
public:
    A(int data){
        m_data = data;
        cout << "A(int)" << endl;
    }
};
class B: public A{
public:
    B(int data):A(data){
        cout << "B(int)" << endl;
    }
    void set(int data){
        m_data = data;
    }
};
class C: public A{
public:
    C(int data):A(data){
        cout << "C(int)" << endl;
    }
    int get(void){
        return m_data;
    }
};
class D: public B, public C{
public:
    D(int data): B(data), C(data){
        cout << "D(int)" << endl;
    }
};
int main(void){
    D d(100);
    cout << sizeof(d) << endl;
    cout << d.get() << endl; // 100
    d.set(200);
    cout << d.get() << endl; //100
    return 0;
}
  • 以上set(200)后还是100
  • 解决方式:虚继承
  • 虚继承语法:
    • 在继承表使用virtual关键字修饰
    • 位于继承链末端子类负责构造公共基类子对象
cpp 复制代码
#include <iostream>
using namespace std;
class A{
protected:
    int m_data;
public:
    A(int data){
        m_data = data;
        cout << "A(int)" << endl;
    }
};
class B: virtual public A{
public:
    B(int data):A(data){
        cout << "B(int)" << endl;
    }
    void set(int data){
        m_data = data;
    }
};
class C: virtual public A{
public:
    C(int data):A(data){
        cout << "C(int)" << endl;
    }
    int get(void){
        return m_data;
    }
};
class D: public B, public C{
public:
    D(int data): B(data), C(data), A(data){
        cout << "D(int)" << endl;
    }
};
int main(void){
    D d(100);
    cout << sizeof(d) << endl;
    cout << d.get() << endl; // 100
    d.set(200);
    cout << d.get() << endl; //200
    return 0;
}
相关推荐
Highcharts.js14 小时前
通过CSS变量实现图表色彩与逻辑解耦、图表主题统一|Highcharts Palette 详解
c++·echarts·highcharts·可视化开发·palette·styledmode·图表样式
玖玥拾14 小时前
C/C++ 基础笔记(八)
c语言·c++
郝学胜_神的一滴14 小时前
Qt 高级开发 027: QTabWidget自定义样式表美化实战
c++·qt
啦啦啦啦啦zzzz14 小时前
数据结构:哈夫曼编码
数据结构·c++·哈夫曼编码
兵哥工控14 小时前
MFC开关量输出发脉冲实例
c++·mfc·开关量发脉冲
ChillCoding15 小时前
更新中:C++ STL库,查找排序(基础算法),数据结构,数学算法,竞赛相关基础
数据结构·c++·算法
智者知已应修善业15 小时前
【51单片机使用IO组赋值方法实现无源蜂鸣器响时LED12亮不响时34亮】2024-3-7
c++·经验分享·笔记·算法·51单片机
.千余15 小时前
【C++】深挖STL list底层:解迭代器与节点存储逻辑
开发语言·c++·笔记·学习·其他
雪落漂泊15 小时前
C++ 继承与多态(上)
开发语言·c++
聆风吟º15 小时前
【C++11新章】列表初始化详解
开发语言·c++·列表初始化