使用派生类分配Base类指针的内存

时间:2017-02-09 11:49:29

标签: c++ pointers heap-memory

我是C ++的新手。我正在学习c ++ oops概念。 是否允许使用Derived类(D)分配Base类(B)指针的内存?

B *a = new D();

我的代码:

#include <iostream>
using namespace std;

class B
{
public:
        B()
        {
                cout<<"B constructor"<<endl;
        }

        ~B()
        {
                cout<<"B Destroctur"<<endl;
        }
};

class D : public B
{
public:
        D()
        {
                cout<<"D constructor"<<endl;
        }

        ~D()
        {
                cout<<"D Destroctur"<<endl;
        }
};

int main()
{
        B *a = new D();
        delete a; // Is valid?
}

此外,释放基类指针的内存是否有效?

delete a;

3 个答案:

答案 0 :(得分:4)

只要你声明base destructor virtual:

就有效
virtual ~B() { /*B destructot code*/}

答案 1 :(得分:1)

你创造了什么,D类的对象是从类B派生的。类型B的指针,指定创建对象的地址是一个指针,指针指向“D类的B部分”。创建的对象仍然是D类,可以转换为D类指针。

这也是限制在当前作用域中使用D类功能的方法,或者创建具有不同类型的对象列表,这些对象必须全部来自同一基类(典型示例是dog和{{ 1}}类扩展cat类,并且都放在animal列表中)

答案 2 :(得分:1)

根据您的代码,输出将为

B constructor
D constructor
B Destructor  ==> Base class 

派生类的内存不会被删除。因此避免这种情况,我们需要在基类析构函数中使用 virtual 关键字。

virtual ~B()
{
     cout<<"B Destroctur"<<endl;
}

在运行时,在调用基类(B)析构函数时,它将调用派生类析构器(D),然后执行基类析构函数。

如果基类析构函数是虚拟的,则输出为

B constructor
D constructor
D Destructor  ==> Derived class
B Destructor  ==> Base class
相关问题