2016-04-20 95 views
0

我想通过它的构造函数初始化基类的一些成员,但是我失败了。在下面的代码中,似乎派生类成员message在调用基构造函数之前未被初始化。 解决方法是有Child(string messg_arg) : message(messg_arg), Parent(messg_arg),但有什么办法可以避免这种情况?派生类中初始化的顺序

class Parent 
{ 
protected: 
    string something; 
    Parent(string something_arg) : something(something_arg) 
    {} 

} 

class Child : public Parent 
{ 
public: 
    string message; 
    Child(string messg_arg) : message(messg_arg), Parent(message) 
    {} 
} 
+0

初始化顺序由成员出现的顺序决定,基类出现在成员之前。随着这一点,你究竟在努力完成什么? “Child”类中的“message”会隐藏“Parent”类中的消息。 – MicroVirus

+0

我试图在派生类中构造一个对象,并通过引用将其传递给基类。无论如何,我会重新考虑这个设计。 – user4168715

+0

而不是传递东西到基地,让基地定义一个函数,从它的继承者获取的东西,并强制继承人通过使函数纯虚拟实现它。 '虚拟东西&getStuff()= 0;'在这里有几个潜在的性能考虑,但大多数时候这是一个简单而安全的方式来获得你想要的。 – user4581301

回答

0

在派生类中的任何成员构造函数之前调用基类构造函数。这应该工作得很好:

Child(string messg_arg) : Parent(messg_arg), message(messg_arg) 
{} 
+0

但是,如果我想在派生类中构造一个对象,然后通过引用将其传递给基类呢? – user4168715

+0

@ user4168715这是不可能的,请参阅编辑。初始化基础之后,您必须传递它。 – emlai

+0

非常清楚,非常感谢。 – user4168715