//42dk2j_cpp_c++多繼承與虛基類_txwtech-供了解
//多繼承與虛繼承--實際開發中,盡量不用多繼承。java與c#沒有多繼承,實踐證明可以不用多繼承。
//--多繼承
//--多繼承中的二義性問題
//二義性:
//42dk2j_cpp_c++多繼承與虛基類_txwtech
//多繼承與虛繼承--實際開發中,盡量不用多繼承。java與c#沒有多繼承,實踐證明可以不用多繼承。
//--多繼承
//--多繼承中的二義性問題
//二義性:
/*1.當Pegaus飛馬,同時繼承了Horse和Bird時,Horse和bird都有相同的函數getColor和itsColor. 一個同時繼承2個的情況
***class Pegasus :public Horse, public Bird//多繼承
2. 2個繼承一個的情況。Horse和bird都繼承Animal的年齡,到了飛馬Pegasus繼承Horse和bird時,那到底繼承哪個Animal的age呢?
這種情況就需要用到C++的進階特性,叫虛基類
虛基類專門解決,菱形多繼承産生的二義性問題
/*
當class Horse:public Animal
//改成虛繼承:
class Horse :virtual public Animal時,執行時horse就不會構造Animal了。
class Bird :virtual public Animal時,執行時bird就不會構造Animal了。
Pegaus飛馬同時繼承了Horse和Bird,就會直接構造Animal
--虛基類解決二義性問題
--虛基類的構造函數
java與c#沒有多繼承 */
#include <iostream>
using std::cout;
using std::endl;
enum COLOR {Red,Green,Blue,Yellow,White,Black,Brown};
class Animal
{
public:
Animal(int);
virtual ~Animal() { cout << "Animal析構函數被調用" << endl; }
virtual int GetAge() { return itsAge; }
virtual void SetAge(int age) { itsAge = age; }
private:
int itsAge;
};
Animal::Animal(int age) :itsAge(age)
{
cout << "animal的構造函數被調用\n";
}
//class Horse:public Animal
//改成虛繼承:
class Horse :virtual public Animal
{
public:
Horse(COLOR color,int height,int age);
virtual ~Horse()
{
std::cout << "Horse的析構函數被調用。。。";
}
virtual void Whinny() const
{
std::cout << "Whinny!...";
}
virtual int GetHeight() const { return itsHeight; }
virtual COLOR GetColor() const { return itsColor; }
private:
int itsHeight;
COLOR itsColor;
};
Horse::Horse(COLOR color,int height,int age) :Animal(age),itsColor(color),itsHeight(height)
{
std::cout << "Horse的構造函數被調用。。。\n";
}
//class Bird :public Animal
//改成虛繼承:
class Bird :virtual public Animal
{
public:
Bird(COLOR color, bool migrates,int age);
virtual ~Bird() { std::cout << "鳥的析構函數被調用。。。"; }
virtual void Chirp() const { std::cout << "鳥會叫" << std::endl; }//鳥叫
virtual void Fly() const
{
cout << "I can fly!I can fly!I can fly!" << endl;
}
virtual bool GetMigration() const { return itsMigration; }
virtual COLOR GetColor() const { return itsColor; }
private:
bool itsMigration;//鳥會不會遷移
COLOR itsColor;
};
Bird::Bird(COLOR color, bool migrates,int age) :Animal(age),itsColor(color), itsMigration(migrates)
{
cout << "Bird的構造函數被調用。。。\n" << endl;
}
//Peagsus飛馬
class Pegasus :public Horse, public Bird//多繼承
{
public:
void Chirp() const { Whinny(); }//調用鳥,實際馬叫
Pegasus(COLOR,int, bool, long,int);
~Pegasus() { cout << "Pegasus的析構函數被調用了。。。\n"; }
virtual long GetNumberBelievers() const { return itsNumberBelievers; }
private:
long itsNumberBelievers;
};
Pegasus::Pegasus(COLOR aColor,int height, bool migrates, long numBelieve,int age)
:Horse(aColor,height,age),
Bird(aColor,migrates,age),
itsNumberBelievers(numBelieve),
//改成虛基類了,增加了Animal(age)
Animal(age)//爺爺的構造函數的調用
//初始化清單通過構造函數指派
{
cout << "Pegasus構造函數被調用\n" << endl;
}
int main()
{
Pegasus *pPeg = new Pegasus(Blue,5, true, 10,2);
pPeg->Fly();
pPeg->Whinny();//馬叫
pPeg->Chirp();//調用鳥,實際馬叫.Chirp被重寫了。
cout << "有" << pPeg->GetNumberBelievers() << "人相信世界上有飛馬。" << endl;
//std::cout << " c++多繼承與虛基類_txwtech" << std::endl;
//getchar();
//不知道調用那個GetColor(),二義性問題
//pPeg->GetColor();
COLOR color=pPeg->Horse::GetColor();
cout << "飛馬的顔色:" << color << endl;
COLOR color1 = pPeg->Bird::GetColor();
cout << "鳥的顔色:" << color1 << endl;
/*
//二義性:
/*1.當Pegaus飛馬,同時繼承了Horse和Bird時,Horse和bird都有相同的函數getColor和itsColor. 一個同時繼承2個的情況
***class Pegasus :public Horse, public Bird//多繼承
2. 2個繼承一個的情況。Horse和bird都繼承Animal的年齡,到了飛馬Pegasus繼承Horse和bird時,那到底繼承哪個Animal的age呢?
這種情況就需要用到C++的進階特性,叫虛基類
虛基類專門解決,菱形多繼承産生的二義性問題
*/
//對getAge通路不明确。
//pPeg->GetAge();
/*
當class Horse:public Animal
//改成虛繼承:
class Horse :virtual public Animal時,執行時horse就不會構造Animal了。
class Bird :virtual public Animal時,執行時bird就不會構造Animal了。
Pegaus飛馬同時繼承了Horse和Bird,就會直接構造Animal,改後,就可以使用
pPeg->GetAge()了;
*/
pPeg->GetAge();
delete pPeg;
return 0;
}