Dog和Cat类是继承自Mammal类,用Mammal类指针分别指向子类对象,并调用虚函数(Speak()),可实现多态。但是问题来了,如果Dog类还有自己特有的成员,如:wagTail(),此时用Mammal类指针去调用会报错。当然如果把wagTail()成员放在Mammal类中,能够解决该问题,但是Cat类并不需要wagTail(),造成类继承混乱。
此时可以使用dynamic_cast运算符,可将Mammal指针转换为Cat指针,在运行阶段,将检查转换是否可行,转换得到的Cat指针将没有任何问题。如果转换不可行,就根本不会有Cat对象,而是指向空。
class Mammal
{
public:
Mammal(){ cout << "Mammal Constructor!" << endl; }
virtual ~Mammal(){cout << "Mammal Destructor!" << endl;}//需要被集成的基类,析构函数都应该设置为虚函数
Mammal(const Mammal& obj)
{
cout << "Mammal Copy Constructor!" << endl;
}
virtual void speak() const
{
cout << "Mammal speak!" << endl;
}
};
class Dog:public Mammal
{
public:
Dog()
{
cout << "Dog Constructor!" << endl;
}
Dog(const Dog& obj)
{
cout << "Dog Copy Constructor!" << endl;
}
~Dog()
{
cout << "Dog Destructor!" << endl;
}
void speak() const{ cout << "Wang wang..." << endl; }
void wagTail() const { cout << "Dog is wagging tail..." << endl; }
};
class Cat :public Mammal
{
public:
Cat()
{
cout << "Cat Constructor!" << endl;
}
Cat(const Cat& obj)
{
cout << "Dog Copy Constructor!" << endl;
}
~Cat()
{
cout << "Cat Destructor!" << endl;
}
void speak() const{ cout << "Meow Meow..." << endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
Mammal* ptrArray[2];
ptrArray[0]= new Dog();
ptrArray[1] = new Cat();
for each (Mammal* var in ptrArray)
{
var->speak();//用父类指针指向子类对象,调用虚函数,实现多态
}
//ptrArray[0]->wagTail(); //Error:wagTail()是Dog类的成员
Dog* pDog = dynamic_cast<Dog*>(ptrArray[0]);
pDog->wagTail();//correct
for each (Mammal* var in ptrArray)
{
if (var)
{
delete var;
var = nullptr;
}
}
}
输出:
Mammal Constructor!
Dog Constructor!
Mammal Constructor!
Cat Constructor!
Wang wang...
Meow Meow...
Dog is wagging tail...
Dog Destructor!
Mammal Destructor!
Cat Destructor!
Mammal Destructor!
请按任意键继续. . .