首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++中的downcast问题

c++中的downcast问题
EN

Stack Overflow用户
提问于 2010-11-16 02:51:09
回答 5查看 2.8K关注 0票数 0
代码语言:javascript
复制
#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的构造函数时?

EN

回答 5

Stack Overflow用户

发布于 2010-11-16 02:57:02

找不到mDerivedData1的内存分配位置的原因是没有分配内存。您执行了无效的类型转换。存储在base中的内容是一个指向Base实例的指针。使用类型转换告诉编译器它实际上是一个指向Derived实例的指针并不会导致这种情况(但编译器无论如何都会相信您,因为您是负责人)。该对象仍然只是一个Base。如果你需要一个Derived,那么你需要实例化一个Derived。您可以使用dynamic_castBase指针转换为Derived指针。

代码语言:javascript
复制
Base* base = new Derived;
Derived* derived = dynamic_cast<Derived*>(base);
derived->mDerivedData1 = 6;
票数 8
EN

Stack Overflow用户

发布于 2010-11-16 02:57:03

如果您更改以下内容,它将正常工作:

代码语言:javascript
复制
Base* base = new Base();

至:

代码语言:javascript
复制
Base* base = new Derived();

但一般来说,除非你非常确定自己在做什么,否则你永远不应该沮丧,即使这样,这通常也是一个非常糟糕的设计的标志。

票数 4
EN

Stack Overflow用户

发布于 2010-11-16 02:56:46

您实际上是在重写堆中不属于原始base对象的某些部分。这可能会覆盖堆上的另一个对象,或者可能发生其他无法解释的事件。

在很大程度上,C++让你做你要它做的事情。你在搬起石头砸自己的脚。:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4187747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档