c++中继承对象释放问题
当父类指针指向子类对象,创建时同时创建了父类对象和子类对象,而释放指针时只调用了父类的析构函数,
需在父类中使用虚析构方可同时释放父子类对象,问题:
1.创建时 父子类对象是否都分配了相应的空间
2.父类指针指向子类对象时 ,他们分配的内存关系是怎样的,具体过程?
3.此类指针是否无需释放子类对象,是不是系统自动完成
求指导 C++ 继承 指针
[解决办法]
1.创建时 父子类对象是否都分配了相应的空间
---------------------------------------------
你的理解有误,用父类的指针new一个子类的对象,只有1个子类的对象,没有父子2个对象。
只是子类的对象中包含有父类对象的那部分成员变量。
大致可以看作一个类似结构的东西,第一部分的变量是父类的,第二部分的变量是子类的。
如果有虚函数,在这个结构中还包含一个虚函数表的地址。
2.父类指针指向子类对象时 ,他们分配的内存关系是怎样的,具体过程?
-----------------------------
不清楚,我对细节不了解。
3.此类指针是否无需释放子类对象,是不是系统自动完成
------------------------------------------------------
对象的释放(析构)过程,是先析构自己那部分,然后一层层往上(父类)析构,直到对象完整析构。
这个过程是规定的,系统完成。
有没有虚函数的区别,就是从哪里开始析构的区别。
假如指针是父类的指针,指向子类的对象。
有虚函数,则 子类部分析构--> 父类部分析构
没虚函数,则 父类部分析构(子类部分没有得到析构)
[解决办法]
可以用c++ RTTI的 操作符 dynamic_cast<type*>(p) 把p指针转换成type类型的,不成功返回NULL
做了个简单的demo。
#include <iostream>
using namespace std;
class A
{
public:
void show() const {cout << "A show()\n";}
virtual ~A() {cout << "~A()\n";}
};
class B: public A
{
public:
void show() const {cout << "B show()\n";}
void display() const {cout << "B display()\n";}
~B() {cout << "~B()\n";}
};
int main()
{
A* p1 = new B;
p1->show(); //输出: A show()
//p1->display(); //直接这么调用,编译通不过
//B* p2 = (B*)p1; //把A类的指针强制转换成B类的,可以但不安全,不推荐
B* p2 = dynamic_cast<B*>(p1); //用dynamic_cast转换,安全,不成功的话p2=NULL
if (p2 != NULL) //加个判断,确保成功转换
{
p2->show(); //输出: B show()
p2->display(); //输出: B display()
}
delete p1;
return 0;
}