[英]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.