使用派生类分配基类指针的内存 我是C++新手。我正在学习C++ OOPS概念。strong>是否允许使用派生类(D)分配基类(B)指针的内存? B *a = new D();

使用派生类分配基类指针的内存 我是C++新手。我正在学习C++ OOPS概念。strong>是否允许使用派生类(D)分配基类(B)指针的内存? B *a = new D();,c++,pointers,heap-memory,C++,Pointers,Heap Memory,我的代码: #include <iostream> using namespace std; class B { public: B() { cout<<"B constructor"<<endl; } ~B() { cout<<"B Destroctur"<<endl; }

我的代码:

#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?
}

只要您声明基本析构函数为虚拟,它就有效:

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

您所做的是创建类D的对象,该对象派生自类B。已创建对象的地址分配给的类型B指针是一个指针,其指令指向“类D的B部分”。创建的对象仍然属于类D,可以转换为类D指针


这也是一种在当前范围内限制使用D类功能的方法,或者创建一个具有不同类型的对象列表,这些对象都必须从相同的基类派生(典型示例是
类扩展
动物
类,并且根据您的代码都放在
宠物
列表中)

,输出将是

B constructor
D constructor
B Destructor  ==> Base class 
B constructor
D constructor
D Destructor  ==> Derived class
B Destructor  ==> Base class
派生类内存不会被删除。为了避免这种情况,我们需要在基类析构函数中使用virtual关键字

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

没有“基类指针的内存”这样的东西。这是一个开始学习基础知识的好地方:为什么需要基类指针作为
虚拟的
,请参阅
B constructor
D constructor
D Destructor  ==> Derived class
B Destructor  ==> Base class