文章目录
-
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;
}