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;
}
相关推荐
啦啦啦啦啦zzzz3 小时前
算法:回溯算法
c++·算法·leetcode
Lzg_na4 小时前
订阅发布模块事例
c++
郝学胜-神的一滴4 小时前
[简化版 GAMES 104] 现代游戏引擎 02:拆解现代游戏引擎5+1层级架构,吃透引擎底层核心逻辑
c++·unity·架构·游戏引擎·图形渲染·unreal engine·系统设计
汉克老师4 小时前
2026年CSP-J初赛分数线-----预测
c++·csp-j·小学生·学c++编程
脱胎换骨-军哥4 小时前
C++数据库存储引擎内核开发:B+树索引与MVCC并发控制的完整实现
数据库·c++·b树
小保CPP5 小时前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
乐观勇敢坚强的老彭5 小时前
信奥C++一维数组笔记
开发语言·c++·笔记
码上有光5 小时前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
王维同学6 小时前
[原创][Windows C++]Explorer Shell 扩展、图标覆盖与 COM 服务器定位
c++·windows·注册表
code_pgf6 小时前
C++ 工程架构设计规范
c++·机器人