#include<iostream>
using namespace std;
class A1
{
public:int a = 10;};
class A2 {
public:int b = 20;
};
class B :public A1, public A2
{
public:int c = 30;
};
int main(){B b;cout << b.a << b.b << b.c << endl;return 0;
}
如果基類和派生類中的成員重名,在成員前面加類名和域名解析符就行了
#include<iostream>
using namespace std;
class A1
{
public:int a = 10;};
class A2 {
public:int a= 20;
};
class B :public A1, public A2
{
public:int a = 30;
};
int main(){B b;cout << b.a << b.A1::a << b.A2::a << endl;return 0;
}
多繼承的特殊情況:菱形繼承
?B和C都繼承于A,D繼承B和C。
A里有個a,B C繼承后各自有這個a,但是D繼承B C就從B C各個繼承了個a,一共倆a了
編譯器找到了兩個不知道用哪個;
所以我們可以在a前面加上類名和作用域解析符;
#include<iostream>
using namespace std;
class A
{
public:int a = 10;};
class B:public A
{
public:};
class C:public A
{
public:};
class D:public C,public B{};
int main(){D d;d.C::a = 80;d.B::a=30;cout << &d.C::a << endl<< &d.B::a << endl;return 0;
}
00000015C87FF568
00000015C87FF56C
這倆a地址不一樣不是一個a;
但是對象d真的需要兩個a嗎,如果a表示的是姓名或年齡顯然一個人不需要兩個姓名或者年齡;
用虛繼承;
00000001000FF8F8
00000001000FF8F8C:\Users\33007\source\repos\ConsoleApplication8\x64\Debug\ConsoleApplication8.exe (進程 4608)已退出,代碼為 0。
按任意鍵關閉此窗口. . .
這樣他倆就是一個變量了;
這么些就完了: