我正在练习在C ++中使用多态。
下面是我的超类和子类实现。
class Animal{
public:
int num ;
string name ;
public:
Animal()
{
};
Animal( int i, string n)
{
num = i;
name = n ;
};
void bark()
{
cout<<"---"<<endl;
};
};
class Cat : public Animal
{
public:
Cat(){ }
Cat( int i, string n) : Animal( i, n)
{
cout<<"construct "<<"Cat"<<"!!"<< endl;
};
public:
void bark()
{
cout<<"MMM"<<endl;
}
};
class Dog : public Animal
{
public:
Dog() {}
Dog( int i, string n) : Animal( i, n)
{
cout<<"construct "<<"Dog"<<"!!"<< endl;
};
void bark()
{
cout<<"WWW"<<endl;
}
};
show(Animal a){
cout< <a.num << endl << a.name << endl;
a.bark();
};
然后,我想如果我创建一只猫和一只狗并调用show(),那只猫将打印出MMM和狗WWW。 但是在我这样做之后,
int main()
{
Cat c1(1,"Kitty") ;
Dog d1(2,"Doggy");
cout<<endl;
show(c1);
show(d1);
}
结果是,
construct Cat!!
construct Dog!!
1
Kitty
---
2
Doggy
---
这两个bark()函数没有执行我在子类中重写的操作,而是仍然执行超类定义的操作。
但是我发现,如果我以这种方式直接在main()c1.bark()中使用该函数,那么它将起作用。
这怎么了?