首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >继承默认构造函数,是一个矛盾吗?

继承默认构造函数,是一个矛盾吗?
EN

Stack Overflow用户
提问于 2020-06-09 22:28:48
回答 2查看 63关注 0票数 0

在C++ (继承主题)中,我读到:

派生类与任何其他类一样,自动具有默认构造函数、复制构造函数和赋值操作符。编译器生成的默认构造函数调用基类默认构造函数。

但另一方面:

基类构造函数不是继承的,我们必须显式定义派生类所需的任何构造函数

1)继承构造函数是什么意思?

2)上面写的不是一个矛盾吗?

如果可能的话,我希望增加一些例子来帮助我理解。

EN

回答 2

Stack Overflow用户

发布于 2020-06-09 22:37:01

“基类构造函数不被继承”意味着在类Base中定义的任何构造函数对于派生类Derived都不可用,除非在Derived中重新定义了它。这对于默认构造函数也是有效的。但是,“派生类自动具有默认构造函数”表示编译器将自动生成默认构造函数,就像对每个类一样。因此编译器将在派生类中重新定义默认构造函数;它仍未被继承。

唯一的问题是,“我们必须明确定义派生类所需的任何构造函数”,如果不存在此语句应保持的上下文,则似乎是错误的。在派生类中肯定有未明确定义的构造函数。这可以很容易地通过定义一个没有任何显式构造函数的派生类来显示:

代码语言:javascript
运行
复制
struct Base {
    Base () { std::cout << "in default constructor of Base; not inherited, but still called." << std::endl; };
};

struct Derived : public Base {
   // no explicitly defined constructor...
};

int main() {
    Derived d;
}

输出:

代码语言:javascript
运行
复制
in default constructor of Base; not inherited, but still called.

因此,我倾向于说,您引用的“.我们必须明确定义派生类所需的任何构造函数”的语句要么不精确,要么在完整上下文中显示,要么错误。

票数 2
EN

Stack Overflow用户

发布于 2020-06-10 14:04:07

代码语言:javascript
运行
复制
struct s {
    s() : s_str("my string") {}; // default constructor
    std::string s_str;
};

struct d : s {
    std::string d_str;
};

如果d没有任何需要构造的成员,默认构造函数将简单地使用s::s()构造s,该s::s()表面上看起来类似于继承(并且可以以这种方式实现)。但是,当您将数据成员添加到派生类时,这是行不通的。

s的默认构造函数使用文本"my string"构造s_str

如果s::s()是在d中继承的,它就不会知道d_str,所以也不会构造它。所以它不是遗传的。

相反,编译器为d生成一个默认构造函数,该构造函数使用std::string的默认构造函数构造d_str,并使用s::s()构造s基。

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

https://stackoverflow.com/questions/62292891

复制
相关文章

相似问题

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