如何将类的成员对象传递给它的基类的构造函数?

时间:2014-02-13 23:22:12

标签: c++

我想创建一个将成员对象传递给其父对象进行初始化的类。下面的代码显示了我正在尝试做的事情。

class TQueueViewerForm1 : public TQueueViewerForm
{
private:    // User declarations
  DOMMsgCollectionEditorImpl m_collection;
public:     // User declarations
  __fastcall TQueueViewerForm1(TComponent* Owner);
};

__fastcall TQueueViewerForm1::TQueueViewerForm1(TComponent* Owner)
  : TQueueViewerForm(Owner, m_collection)
{
}

但这似乎不起作用。看起来在初始化m_collection之前调用构造函数TQueueViewerForm()。这会导致程序崩溃,因为TQueueViewerForm()会尝试使用未初始化的对象。

那么......我的选择在这里?理想情况下,我想在以某种方式初始化父类之前初始化m_collection。

4 个答案:

答案 0 :(得分:1)

您必须记住继承操作的顺序。构造类的实例时,首先构造基本组件(即基类构造函数运行完成);然后,你的类成员被初始化,最后,你的类'构造函数被运行。

在这种情况下,在初始化之前,你会将一些随机内存传递给你的基类。

答案 1 :(得分:0)

派生类的父构造函数将在子构造函数之前调用始终。您有一个选择是将您尝试执行的初始化代码放在父类的单独函数中,并在派生类的构造函数中调用该函数。

答案 2 :(得分:0)

class CollectionHolder {
public:
  DOMMsgCollectionEditorImpl m_collection;
};

class TQueueViewerForm1 :
  private CollectionHolder,  // important: must come first
  public TQueueViewerForm {
};

对我来说有点太微妙了。就个人而言,我试图找到一种不需要我进行这种体操的设计。

答案 3 :(得分:0)

您可以使用派生类构造函数的初始化列表将参数传递给基类构造函数。

class Parent
{
public:
    Parent(std::string name)
    {
        _name = name;
    }

    std::string getName() const
    {
        return _name;
    }

private:
    std::string _name;
};

//
// Derived inherits from Parent
//
class Derived : public Parent
{
public:
    //
    // Pass name to the Parent constructor
    //
    Derived(std::string name) :
    Parent(name)
    {
    }
};

void main()
{
    Derived object("Derived");

    std::cout << object.getName() << std::endl; // Prints "Derived"
}