c++为什么只能通过指针或引用实现多态,而不可以通过对象赋值实现

探讨了C++中多态的实现原理,特别是在使用引用和指针时的多态行为,并对比了直接赋值情况下多态失效的原因,深入解析了内存布局与多态之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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之所以支持多态,是因为它们并不引发内存任何“与类型有关的内存委托操作; 会受到改变的。只有它们所指向内存的大小和解释方式 而已”
当一个基类对象被直接初始化为一个派生类对象是,基类对象会被切割放入较小的内存中,因此多态不再呈现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值