使用派生类分配基类指针的内存
Allocate memory of Base class pointer using derived class
我是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 类功能或创建具有不同类型的对象列表的方法,这些对象必须全部派生自同一基类(典型示例是 dog
和cat
类扩展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