c++ 繼承實(shí)例
1.默認(rèn)是 隱式代碼: : private Person
2.私有繼承:在子類里面是可以訪問父類的成員澄干,但是在類的外面不行
3.必須公開繼承办悟,才可以訪問父類的成員
#include <iostream>
using namespace std;
class Person {
public:
char *name;
int age;
public:
Person(char *name, int age) : name(name) {
this->age = age;
cout << "Person 構(gòu)造函數(shù)" << endl;
}
void print() {
cout << this->name << " , " << this->age << endl;
}
};
// 1.默認(rèn)是 隱式代碼: : private Person
// 2.私有繼承:在子類里面是可以訪問父類的成員,但是在類的外面不行
// 3.必須公開繼承,才可以訪問父類的成員
class Student : public Person {
// 類 默認(rèn)是私有,注意下
private:
char * course;
public:
// :父類 , 給自己子類成員初始化
Student(char * name, int age, char* course) : Person(name, age) , course(course) {
cout << "Student 構(gòu)造函數(shù)" << endl;
}
void test() {
cout << name << endl;
cout << age << endl;
print();
}
};
int main() {
Student stu("李元霸", 99, "C++");
// 公開繼承,才可以拿父類的成員
stu.name = "李四";
return 0;
}
C++是有多繼承的
Java語言不允許多繼承介杆,多繼承有歧義,如果Java語言多繼承 就會(huì)導(dǎo)致代碼不健壯韭寸,(二義性)
Java多實(shí)現(xiàn):做的非常棒春哨,嚴(yán)格避免出現(xiàn) 二義性問題(歧義)
下面是,第一種簡單多繼承問題恩伺,解決方案赴背。
#include <iostream>
using namespace std;
class BaseActivity1 {
public:
void onCreate() {
cout << "BaseActivity1 onCreate" << endl;
}
void onStart() {
cout << "BaseActivity1 onStart" << endl;
}
void show() {
cout << "BaseActivity1 show" << endl;
}
};
class BaseActivity2 {
public:
void onCreate() {
cout << "BaseActivity2 onCreate" << endl;
}
void onStart() {
cout << "BaseActivity2 onStart" << endl;
}
void show() {
cout << "BaseActivity2 show" << endl;
}
};
class BaseActivity3 {
public:
void onCreate() {
cout << "BaseActivity3 onCreate" << endl;
}
void onStart() {
cout << "BaseActivity3 onStart" << endl;
}
void show() {
cout << "BaseActivity3 show" << endl;
}
};
// 子類 繼承 三個(gè)父類
class MainActivity1 : public BaseActivity1, public BaseActivity2, public BaseActivity3 {
public:
void onCreate() {
cout << "MainActivity1 onCreate" << endl;
}
void onStart() {
cout << "MainActivity1 onStart" << endl;
}
void showSonInfo() {
cout << "MainActivity1 showSonInfo" << endl;
}
// 解決方案二: 子類上 重寫父類的show函數(shù)
void show() {
cout << "MainActivity1 show" << endl;
}
};
int main() {
// 這個(gè)是優(yōu)先尋找子類的函數(shù),因?yàn)樘貏e明確,沒有問題凰荚,還沒有產(chǎn)生歧義(二義性)
MainActivity1 mainActivity1; // 子類
mainActivity1.onCreate();
mainActivity1.onStart();
mainActivity1.showSonInfo();
// error: request for member 'show' is ambiguous
// 不明確燃观,二義性,歧義
// mainActivity1.show();
// 解決方案一: 明確指定父類 ::
mainActivity1.BaseActivity3::show();
mainActivity1.BaseActivity2::show();
mainActivity1.BaseActivity1::show();
// 解決方案二: 子類上 重寫父類的show函數(shù)
mainActivity1.show();
return 0;
}
多繼承 二義性2:(鉆石問題)
在真實(shí)開發(fā)過程中便瑟,嚴(yán)格避免出現(xiàn) 二義性
#include <iostream>
using namespace std;
// 祖父類
class Object {
public:
int number;
};
// 父類1
class BaseActivity1 : public Object {
};
// 父類2
class BaseActivity2 : public Object {
};
// 子類
class Son : public BaseActivity1, public BaseActivity2 {
// 第二種解決方案: 在類中定義同名成員缆毁,覆蓋掉父類的相關(guān)成員
public:
int number;
};
int main() {
Son son;
// error: request for member 'show' is ambiguous 二義性 歧義
// son.number = 2000;
// 第一種解決方案: :: 明確指定
son.BaseActivity1::number = 1000;
son.BaseActivity2::number = 1000;
// 第二種解決方案: 在類中定義同名成員,覆蓋掉父類的相關(guān)成員
son.number = 3000;
// 第三種解決方案: 【虛基類】 屬于 虛繼承的范疇
return 0;
}
【虛基類】 屬于 虛繼承的范疇
真實(shí)C++開始到涂,是很少出現(xiàn)脊框,二義性(歧義) 如果出現(xiàn), 系統(tǒng)源碼(系統(tǒng)用解決方案)
#include <iostream>
using namespace std;
// 祖父類
class Object{
public:
int number;
void show() {
cout << "Object show run..." << endl;
}
};
// 等下講 virtual 的原理是什么 ...
// 父類1
class BaseActivity1 : virtual public Object {
// public:int number; // 人為制作二義性 error: request for member 'number' is ambiguous
};
// 父類2
class BaseActivity2 : virtual public Object {
// public:int number;
};
// 子類
class Son : public BaseActivity1, public BaseActivity2 {
};
int main() {
Object object;
BaseActivity1 baseActivity1;
BaseActivity2 baseActivity2;
Son son;
object.number = 100;
baseActivity1.number = 200;
baseActivity2.number = 300;
son.number = 400;
object.show();
baseActivity1.show();
baseActivity2.show();
son.show();
cout << object.number << endl;
cout << baseActivity1.number << endl;
cout << baseActivity2.number << endl;
cout << son.number << endl;
return 0;
}
繼承構(gòu)造和析構(gòu)函數(shù)的順序關(guān)系
// 補(bǔ)充點(diǎn): 繼承關(guān)系的時(shí)候践啄,構(gòu)造函數(shù)和析構(gòu)函數(shù) 的順序問題
#include <iostream>
using namespace std;
class Person {
public:
string name;
Person(string name) : name(name) {cout << "Person構(gòu)造函數(shù)" << endl;}
~Person() {cout << "Person析構(gòu)函數(shù)" << endl;}
virtual void test() {
cout << "父 test..." << endl;
}
};
class Student : public Person {
public:
string name;
Student(string name) : Person(name) {
cout << "Student構(gòu)造函數(shù)" << endl;
// Person::test();
}
~Student() {cout << "Student析構(gòu)函數(shù)" << endl;}
void test() {
cout << "子 test..." << endl;
}
};
int main() {
Student student("David");
// Person構(gòu)造函數(shù)
// Student構(gòu)造函數(shù)
// Student析構(gòu)函數(shù)
// Person析構(gòu)函數(shù)
Student student1("A");
student1.test();
return 0;
}