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

Allocate memory of Base class pointer using derived class

本文关键字:指针 内存 基类 分配 派生      更新时间:2023-10-16

我是C++的新手。我正在学习 c++ 哎呀概念。是否允许使用派生类 (D( 分配基类 (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;
只要

您声明基本析构函数 virtual,它就有效:

virtual ~B() { /*B destructot code*/}

你所做的是创建的对象,它是从类 B 派生的类 D.分配给创建对象的地址的 B 类型的指针是一个指针,其中包含指向"类 D 的 B 部分"的指令。创建的对象仍然是类 D,可以强制转换为类 D 指针。

这也是一种限制在当前作用域中使用 D 类功能或创建具有不同类型的对象列表的方法,这些对象必须全部派生自同一基类(典型示例是 dogcat类扩展animal类并且都放在pets<animal>列表中(

根据您的代码,输出将是

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