C++多继承构造函数

C++ Multiple Inheritance Constructor

本文关键字:构造函数 继承 C++      更新时间:2023-10-16

我需要了解一些关于构造函数的知识。我真的不知道如何表达这个问题,但基本上我需要让所有的操作都发生在最后一个类的构造函数中,同时在一个类中的构造函数中创建一个变量,并在另一个类别的构造函数中使用。这行得通吗?安全吗?下面的代码示例。

// Init class
class cInit {
private:
    std::string *m_X;
public:
    cInit() { m_X = new std::string; }
    std::string *getX() { return m_X; }
};
// Does this work (?)
class cUse {
private:
    std::string *m_X;
public:
    cUse(cInit *x) : m_X( x->getX() ) { }
// Final Class - same question here? Does it work?
class Final : public cInit, public cUse {
public:
    Final() : cInit(), cUse( this ) { }
}

由于基本构造函数是按声明顺序调用的,因此将首先调用cInit::cInit()。其构造函数将分配cInit::m_X成员。

然后,将调用cUse::cUse(cInit *),并将对cInit::getX()的调用结果分配给cUse::m_X。假设cInit::getX()不是一个虚拟函数,那么这样调用它是安全的。

换句话说,这个代码没有任何问题。除了它丑陋(或者我应该说设计不好?)、令人困惑,而且只会在未来引发麻烦。

希望能有所帮助。

我更喜欢以下设计(因为它更面向RAII):

// Init class
class cInit {
private:
    std::string m_X;
public:
    cInit() : m_X() {}
    std::string & getX() { return m_X; }
};
class cUse {
private:
    std::string& m_X;
public:
    cUse(std::string &x) : m_X( x ) { }

//最后一堂课——这里有同样的问题吗?它有效吗?

在您的示例中,您使用的是this,虽然cInit已经是了,但它在那时还没有完全构建。使用vtables(虚拟函数定义),this的使用肯定会失败
请尝试以下操作:

class Final : public cInit, public cUse {
public:
    Final() : cInit(), cUse( cInit::getX() ) { }
}

您也可以像在原始示例中那样使用指针,但我强烈建议您不要一直使用原始指针。最好为cInit::m_X选择一个std::unique_ptr(具有预c++11标准的std::auto_ptr),为cUse::m_X选择一个原始指针。