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;
}
相关推荐
水饺编程1 小时前
第5章,[Win32 章节] :绘图模式
c语言·c++·windows·visual studio
INGNIGHT1 小时前
1908 · 布尔表达式求值(stack单调栈&dfs)
开发语言·c++·算法
小小杨树2 小时前
【C++】学习:双缓冲视频流水线深解析
c++·性能优化·音视频开发
青少儿编程课堂3 小时前
图形化编程实战:智能交通灯调度台,一个作品讲透循环、条件与广播
c++·python·算法·bfs·信息学竞赛
赵民勇3 小时前
C++无锁编程详解
c++
醉颜凉3 小时前
C++ 中野指针与悬挂指针的区别:从成因到防范,彻底讲清两种危险指针
c++
Demon--hx3 小时前
设计不能被继承的类
开发语言·c++
兔兔兔兔13 小时前
记录C++ 13
开发语言·c++·算法
开心大爆炸4 小时前
ubuntu20.4 安装ros1 noetic版本流程
c++
欧特克_Glodon7 小时前
OpenCV计算机视觉开发入门与实践<二十四>:几何变换之平移、缩放、旋转
c++·人工智能·opencv·计算机视觉