【发布时间】:2018-11-22 17:00:52
【问题描述】:
我有一个父子继承结构。我有一个由父类实例化(新)的对象。我想将此对象向下转换为子类。 我需要一个像强制转换这样的自动例程,因为父类有很多属性,而在子对象中复制父属性是不可能的。
我可以使用 reinterpret_cast 运算符将父对象转换为子对象,这样我的子对象中有父属性值,但我遇到了其他问题。
如果您将内存分配给子特定变量之一,则在向下转换后,当您想要删除子对象时,您将面临内存分段错误错误。看来堆已损坏。
我的代码是这样的:
class parentclass
{
public:
int parent_var = 10;
parentclass()
{
parent_var = 20;
}
};
class childclass :parentclass
{
public:
int* child_var;
childclass()
{
child_var = NULL;
}
};
void main()
{
parentclass* pobj = new parentclass();
childclass* cobj;
cobj = reinterpret_cast<childclass*>(pobj);
//everything is ok, cobj.parent_var has correct value (=20)
//and child specific variables are filled with random variables.
delete cobj;
// cobj delete successfully
parentclass* pobj2 = new parentclass();
childclass* cobj2;
cobj2 = reinterpret_cast<childclass*>(pobj2);
//everything is ok and
//cobj2.parent_var has correct value
cobj2->child_var = new int[10]; // assign memory to child specific variable
delete cobj2; // Here Heap corruption Error occurred.
}
我在 stackoverflow 中阅读了类似的页面,但其中大多数描述了使用子类新建对象时的强制转换。 感谢您的帮助。
【问题讨论】:
-
C++ 不是 C 并且 C 没有类。
-
您使用
parentclass的对象,因为它是childclass的对象。换一种方式就好了。您的代码调用未定义的行为。cobj2->child_var = new int[10];可能会覆盖一些内部内存,这些内存在您删除对象时使用。 -
继承不是这样工作的。当
new创建对象时,它会分配足够的内存来仅存储其元素。它对派生类一无所知。考虑改为创建子对象。还使用static_cast将对象转换为错误的类型会产生未定义的行为。 -
你正在做的不是一个dowcast。向下转换是当你有一个类型为
parentclass *的指针实际上指向一个类型为childclass的对象,并且你想得到一个childclass *。你所拥有的是一个parentclass类型的对象,你在向编译器撒谎关于它的类型。这行不通。 -
为了给这个讨论增加一些理论,你应该看看Liskov substitution principle以更好地理解这个问题。
标签: c++ casting dynamic-cast reinterpret-cast