在c++的多态中,如果一个基类的虚函数被派生类重写,那么把基类的指针指向派生类,就能够通过基类调用被派生类重写的这个虚函数。(对于这点有疑问的,可以看我之前写的C++多态,虚函数,虚函数表,gcc下的单继承,多继承,虚继承的内存布局)。那么如果不用指针或引用会如何?
#include<iostream>
using namespace std;
class Animal{
public:
virtual void eat()
{
cout<<"能吃什么就吃什么"<<endl;
}
virtual void run(){}
private:
int name;
};
class Dog : public Animal{
public:
virtual void eat(){
cout<<"吃狗粮"<<endl;
}
virtual void shout(){}
private:
int age;
};
int main()
{
Dog dog;
Animal&animal1 = dog;
Animal* animal2 = new Dog();
Animal animal3 = dog;
animal1.eat();
animal2->eat();
animal3.eat();
}
执行结果:
可以看出Animal&animal1 = dog;Animal* animal2 = new Dog();
都可以正常实现多态,Animal animal3 = dog
直接赋值却不可以。
这是因为 “一个pointer或一个reference之所以支持多态,是因为它们并不引发内存任何“与类型有关的内存委托操作; 会受到改变的。只有它们所指向内存的大小和解释方式 而已”
当一个基类对象被直接初始化为一个派生类对象是,基类对象会被切割放入较小的内存中,因此多态不再呈现