C++多继承构造函数
C++ Multiple Inheritance Constructor
我需要了解一些关于构造函数的知识。我真的不知道如何表达这个问题,但基本上我需要让所有的操作都发生在最后一个类的构造函数中,同时在一个类中的构造函数中创建一个变量,并在另一个类别的构造函数中使用。这行得通吗?安全吗?下面的代码示例。
// 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
选择一个原始指针。
相关文章:
- 具有相同名称的类的构造函数继承
- 多复制构造函数继承中的惊人行为
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 无法从 c++ 中的构造函数继承
- 在构造函数继承中使用默认构造函数
- 构造函数继承和直接成员初始化
- C++ - 使用私有参数的构造函数继承
- 通过可变参数模板进行C++11构造函数继承
- C++11构造函数继承和不带参数的构造函数
- C++11 - 构造函数继承
- C++构造函数继承
- 使用 C++11 编译器的构造函数继承正在生成错误
- 选择性构造函数继承"Ambiguous resolution"错误
- 什么是构造函数继承
- C++对象中的构造函数继承与方法继承
- C++构造函数继承没有匹配的函数
- C++构造函数继承(从派生类调用构造函数)
- 模板构造函数继承的标准符合语法是什么
- C++构造函数继承错误