#include <iostream>
using std::cout;
using std::endl;
class Base
{
public :
void f();
void g();
int mBaseData1;
};
class Derived : public Base
{
public :
int mDerivedData1;
};
void main()
{
Base* base = new Base();
Derived* derived = (Derived*)(base); // DownCast
derived->mDerivedData1 = 6;
cout<< derived->mDerivedData1<<endl; // Result = 6;
}在这段代码中,new base()在堆中分配内存
和Derived* derived = (Derived*)(base)强制转换基址以派生
我们如何使用mDerivedData1?我找不到我们在哪里为mDerivedData1分配内存,或者当我们为allocate mDerivedData1调用Derived的构造函数时?
发布于 2010-11-16 02:57:02
找不到mDerivedData1的内存分配位置的原因是没有分配内存。您执行了无效的类型转换。存储在base中的内容是一个指向Base实例的指针。使用类型转换告诉编译器它实际上是一个指向Derived实例的指针并不会导致这种情况(但编译器无论如何都会相信您,因为您是负责人)。该对象仍然只是一个Base。如果你需要一个Derived,那么你需要实例化一个Derived。您可以使用dynamic_cast将Base指针转换为Derived指针。
Base* base = new Derived;
Derived* derived = dynamic_cast<Derived*>(base);
derived->mDerivedData1 = 6;发布于 2010-11-16 02:57:03
如果您更改以下内容,它将正常工作:
Base* base = new Base();至:
Base* base = new Derived();但一般来说,除非你非常确定自己在做什么,否则你永远不应该沮丧,即使这样,这通常也是一个非常糟糕的设计的标志。
发布于 2010-11-16 02:56:46
您实际上是在重写堆中不属于原始base对象的某些部分。这可能会覆盖堆上的另一个对象,或者可能发生其他无法解释的事件。
在很大程度上,C++让你做你要它做的事情。你在搬起石头砸自己的脚。:)
https://stackoverflow.com/questions/4187747
复制相似问题