- //程序作者:管寧
- //站點:www.cndev-lab.com
- //所有稿件均有版權,如要轉載,請務必著名出處和作者
- #include <iostream>
- using namespace std;
- class Vehicle {
- public:
- Vehicle(int weight = 0) {
- Vehicle::weight = weight;
- cout << "載入Vehicle類構造函數" << endl;
- }
- void SetWeight(int weight) {
- cout << "重新設置重量" << endl;
- Vehicle::weight = weight;
- }
- virtual void ShowMe() = 0;
- protected:
- int weight;
- };
- class Car: virtual public Vehicle//汽車,這裡是虛擬繼承
- {
- public:
- Car(int weight = 0, int aird = 0) : Vehicle(weight) {
- Car::aird = aird;
- cout << "載入Car類構造函數" << endl;
- }
- void ShowMe() {
- cout << "我是汽車!" << endl;
- }
- protected:
- int aird;
- };
- class Boat: virtual public Vehicle//船,這裡是虛擬繼承
- {
- public:
- Boat(int weight = 0, float tonnage = 0) : Vehicle(weight) {
- Boat::tonnage = tonnage;
- cout << "載入Boat類構造函數" << endl;
- }
- void ShowMe() {
- cout << "我是船!" << endl;
- }
- protected:
- float tonnage;
- };
- class AmphibianCar: public Car, public Boat//水陸兩用汽車,多重繼承的體現
- {
- public:
- AmphibianCar(int weight, int aird, float tonnage) : Vehicle(weight), Car(weight, aird), Boat(weight, tonnage)
- //多重繼承要注意調用基類構造函數
- {
- cout << "載入AmphibianCar類構造函數" << endl;
- }
- void ShowMe() {
- cout << "我是水陸兩用汽車!" << endl;
- }
- void ShowMembers() {
- cout << " 重量:" << weight << "頓," << "空氣排量:" << aird << "CC," << "排水量:" << tonnage << " 頓" << endl;
- }
- };
- int main() {
- AmphibianCar a(4, 200, 1.35f);
- a.ShowMe();
- a.ShowMembers();
- a.SetWeight(3);
- a.ShowMembers();
- system("pause");
- return 0;
- }
但是C++多重繼承有個問題是當繼承的方法或變數有相同的時候,到底要用哪種呢?
- 載入Vehicle類構造函數
- 載入Car類構造函數
- 載入Boat類構造函數
- 載入AmphibianCar類構造函數
- 我是水陸兩用汽車!
- 重量:4頓,空氣排量:200CC,排水量:1.35 頓
- 重新設置重量
- 重量:3頓,空氣排量:200CC,排水量:1.35 頓
- 請按任意鍵繼續 . . .
是否有方法可以直接指定要用哪個繼承的方法?
- #include <iostream>
- using namespace std;
- class AA {
- public:
- AA() {
- }
- void fat() {
- printf("Addidas is Fat\n");
- }
- };
- class BB {
- public:
- BB() {
- }
- void fat() {
- printf("Bill is Fat\n");
- }
- };
- class CC: public AA, public BB {
- public:
- using AA::fat;
- CC() {
- }
- };
- class DD: public AA, public BB {
- public:
- DD() {
- }
- };
- int main() {
- CC ca;
- printf("C is call..: ");
- ca.fat();
- DD da;
- printf("D is call..: \n");
- da.AA::fat();
- da.BB::fat();
- return 0;
- }
由此可知,AA::fat() 與 using AA::fat ,皆可指定繼承的哪個方法會被使用。
- C is call..: Addidas is Fat
- D is call..:
- Addidas is Fat
- Bill is Fat
0 意見:
張貼留言