-1

初始化从其基类转换而来的派生类的首选方法是什么?

考虑以下场景:

    class A{
        public:
           A();
           ~A();
    }

    class B : public A{
        public:
           B() {m_b = 0.0;};
           ~B();
           float GetValue(){return m_b;};

        private: 
           float m_b;
    }


    A* a = new A;
    B* b = static_cast<B*>(a);

    float val = b->GetValue();   // This was never initialized because it was not constructed

我当前的解决方案是手动调用 Initialize() 函数,该函数将像构造函数一样执行必要的初始化。

不过,这似乎很草率,必须有更好/更清洁的方法。

非常感谢任何帮助和指导!

4

6 回答 6

5

这是一个错误的构造:

A* a = new A;
B* b = static_cast<B*>(a);

编辑

真的应该是:

B* b = new B();

因为,正如 sbi 指出的那样,A 没有名为 GetValue() 的虚函数,所以永远不能从 A 调用它。

不要进行从 A* 到 B* 的 static_cast。

于 2011-05-11T15:38:20.587 回答
2

您正在将父对象转换为派生类型的对象。那是完全错误的。A 类的对象没有要初始化的 m_b 成员。

于 2011-05-11T15:37:31.037 回答
0

您描述的代码是危险的且无效的,因为 B 是 A,但反之则不然。这将是有效的:

B* b = new B;
A* a = dynamic_cast<A*>(b);
于 2011-05-11T15:38:11.940 回答
0

您没有要初始化的派生类的实例——您只有一个基类的实例。1static_cast1 所做的只是强制编译器允许您将基类视为派生类。

相反,要创建一个B,您应该这样做:

A* a = new B;

这将调用 的构造函数B,初始化m_b0.0

于 2011-05-11T15:38:14.253 回答
0
B* b = static_cast<B*>(a);

static_cast只有当您知道它a实际上指向 的对象B或派生自 的类时,您才应该使用B它,显然情况并非如此。

这是一个不正确的说法。
有效的顺序应该是:

 A* a = new B();
 B* b = static_cast<B*>(a);

a现在指向类型的对象B。它可以这样做是因为指向基类对象的指针总是可以指向派生类的对象,只要它是公共派生。

现在,您可以使用static_cast,因为您确定它a实际上指向class B.
在某些情况下,一个人不知道类的层次结构,并且在这种情况下不能使用static_castC++ 提供了Dynamic_cast在这种情况下调用的另一种转换类型,如果在指针或抛出的情况下转换无效,它将返回一个空指针在引用的情况下例外。

请注意,尽管Dynamic_Cast仅适用于多态类。

于 2011-05-11T15:38:37.343 回答
0

我不确定这是否有效,因为该对象是用创建的sizeof(A)并且sizeof(B)显然更大。

于 2011-05-11T15:36:08.563 回答