cc42a_demo_c++多继承与虚基类
程序员文章站
2022-06-08 18:34:27
...
//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;
}