繁体   English   中英

初始化派生类的成员(C ++)

[英]Initializing members of derived class (C++)

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

请考虑以下情形:

    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()函数,该函数将执行与构造函数一样的必要初始化。

虽然看起来草率,但必须有更好/更清洁的方法。

任何帮助和指导,我们将不胜感激!

这是一个错误的构造:

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

编辑

确实应该是:

B* b = new B();

正如sbi所指出的,由于A没有一个称为GetValue()的虚拟函数,因此永远不能从A调用它。

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

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

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

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

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

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

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

A* a = new B;

这将调用B的构造函数,将m_b初始化为0.0

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

仅当您知道a实际上指向B的对象或从B派生的类时,才应使用static_cast this,显然不是这样。

这是不正确的陈述。
有效顺序应为:

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

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

现在,您可以使用static_cast因为您可以肯定a实际指向class B对象。
在某些情况下,可能有人不知道类的层次结构,并且无法使用static_cast C ++在这种情况下提供了另一种称为Dynamic_cast static_cast类型转换,如果在指针转换的情况下static_cast无效,它将返回空指针或在引用的情况下引发异常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM