天天看點

cc42a_demo_c++多繼承與虛基類

cc42a_demo_c++多繼承與虛基類
cc42a_demo_c++多繼承與虛基類

//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;


}
           

繼續閱讀