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

初始化派生类的成员(C++),c++,constructor,derived-class,initializing,C++,Constructor,Derived Class,Initializing,初始化从基类强制转换而来的派生类的首选方法是什么 考虑以下场景: class A{ public: A(); ~A(); } class B : public A{ public: B() {m_b = 0.0;}; ~B(); float GetValue(){return m_b;}; private:

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

考虑以下场景:

    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函数,该函数将像构造函数那样执行必要的初始化

但这似乎有些草率,必须有更好/更干净的方法


非常感谢您的帮助和指导

我不确定这是否有效,因为该对象是用sizeofA创建的,而sizeofB显然更大

您正在将父对象强制转换为派生类型的对象。这显然是错误的。A类对象没有要初始化的m_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。

这是一个错误的构造:

A* a = new A;
B* b = static_cast<B*>(a);
因为,正如sbi所指出的,A没有一个名为GetValue的虚拟函数,所以永远不能从A调用它

不要从a*到B*进行静态_转换

B* b = static_cast<B*>(a);
a现在指向B类型的对象。它可以这样做,因为指向基类对象的指针可以始终指向派生类的对象,只要它是公共派生

现在,您可以使用static_cast,因为您可以确定a实际上指向类B的对象。 可以有一种情况,其中一个不知道类的层次结构,在这种情况下,不能使用StistalPaskC++提供另一种类型的Dype,在这种情况下,DycRySkyCube,如果在指针的情况下,它是无效的,或者在引用的情况下抛出异常,它将返回空指针。
需要注意的是,Dynamic_Cast仅适用于多态类。

实际上,您需要将a转换为B*,因为GetValue是特定于B的。[现在为什么要设计这样的类是另一个故事]问题不在于演员阵容,因为这个答案会让你相信。Joe Gauterin发现了正确的问题,B没有被实例化,需要一个复制构造函数BA。@Matt这和我说的没什么不同。阅读我的答案,我在那里创造了一个B!!这里不需要复制构造函数,因为您的类不包含指针members@Matt:问题出在施法中,因为您所显示的施法调用了。@托尼:这是错误的。不能通过A*调用B::GetValue,因为它在基类中未声明为virtual。事实上,它根本不在基类中,因此->GetValue是一个语法错误。我意识到这可能是我问题的核心。我可能应该实例化一个调用基类constructorMatt的新B,GetValue函数应该是const,因为它不会改变调用它的对象的状态:float GetValue const{return m_B;};。你从C++学习什么?看一看。如果你能从这些书中学习的话,还有一件事:不赞成从基类指针/引用转换到派生类,这是有充分理由的。你为什么认为你需要这个?你的类名和极简实现没有批评,这是一个伟大的复制!不要暗示你为什么这样设计,但我会质疑这样的设计。你以前用过OO语言编程吗?
B* b = static_cast<B*>(a);
 A* a = new B();
 B* b = static_cast<B*>(a);