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;
}
相关推荐
m0_736919105 小时前
C++代码风格检查工具
开发语言·c++·算法
2301_763472466 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
阿猿收手吧!7 小时前
【C++】std::promise原理与实战解析
c++
m0_706653237 小时前
分布式系统安全通信
开发语言·c++·算法
Zach_yuan7 小时前
深入浅出 JSONCpp
linux·服务器·网络·c++
寻寻觅觅☆8 小时前
东华OJ-基础题-104-A == B ?(C++)
开发语言·c++
lightqjx8 小时前
【C++】unordered系列的封装
开发语言·c++·stl·unordered系列
阿猿收手吧!8 小时前
【C++】string_view:高效字符串处理指南
开发语言·c++
Word码9 小时前
[C++语法] 继承 (用法详解)
java·jvm·c++