首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++多重继承构造函数

C++多重继承构造函数
EN

Stack Overflow用户
提问于 2013-12-05 06:15:07
回答 2查看 15.6K关注 0票数 4

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

代码语言:javascript
复制
// 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 ) { }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-05 06:33:43

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

然后,将调用cUse::cUse(cInit *),并将调用cInit::getX()的结果赋给cUse::m_X。鉴于cInit::getX()不是一个虚函数,这样调用它是安全的。

换句话说,这段代码没有任何错误。除了它是丑陋的(或者我应该说不是精心设计的?),令人困惑,并且只会造成更多的麻烦。

希望能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2013-12-05 06:24:56

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

代码语言:javascript
复制
// 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已经完全构造好了,但它当时还没有完全构造好。使用vtable(虚拟函数定义),this的使用肯定会失败。

请尝试执行以下操作:

代码语言:javascript
复制
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选择一个原始指针。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20387236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档