欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

cc42a_demo_c++多继承与虚基类

程序员文章站 2022-06-08 18:34:27
...

cc42a_demo_c++多继承与虚基类

cc42a_demo_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#没有多继承 */

 

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


}