C++多态是否一定要使用指针分配动态内存?

本文探讨了C++中的多态性,指出多态不仅限于动态内存,也可以通过栈上的指针实现。示例展示了如何使用基类指针调用派生类的虚函数,说明即使对象在栈上,依然可以实现动态绑定。同时,文章提到在某些情况下,如工厂模式中,由于需要保持对象的生命周期超过其局部作用域,因此必须使用堆内存来实现多态。
摘要由CSDN通过智能技术生成

“在C++语言中,当我们使用基类的引用或指针调用一个虚成员函数时,会执行动态绑定。”–c++ primer15.3
根据上面这句话,c++并没有规定多态必须使用动态内存。即指向栈和堆内存的指针和引用都可以进行多态 ,利用指向栈上(stack)空间的指针进行多态:

class Base
{
    public:
        virtual void Display()= 0;
};

class Derived:public Base
{
    public:
        void Display()
        {
            cout << "In derived" << endl;
        }
};

int main()
{
    Base*   base;
    Derived derived1;

    base = &derived1;
    base->Foo();       
    return 0;
}

但是有时候往往被迫使用指向堆空间(heap)的指针进行多态:
典型的例子是工厂模式:


void doSomething(int what) {
    // figure out which implementation to create
    Base * b;
    if(doA) {
        b = new ConcreteA; // 1a
    } else if(doB) {
        b = new ConcreteB; // 1b
    }
    ...
    b->...; // 2
}

你不能使用栈。1a和1b离开作用域时,你从栈中得到的每一个存储都会被回收。你必须使用堆,因为你需要一些能维持局部范围的存储。
这也就是C++primer第12.1.1节p403页使用动态内存的第二个原因–“程序不知道所需对象的准确类型”。
翻译源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值