C++ 面试题 目录

C++11 中继承构造函数 (inheriting constructor) 的用法?

推荐答案

在C++11中,继承构造函数(Inheriting Constructor)允许派生类直接继承基类的构造函数,而不需要显式地在派生类中重新定义这些构造函数。通过使用using声明,派生类可以继承基类的构造函数,从而简化代码并减少重复。

示例代码

-- -------------------- ---- -------
-------- ----------

----- ---- -
-------
    -------- -- -
        --------- -- --------- -- ------ ---- - - - -- - -- ----------
    -

    -------- -- --- -- -
        --------- -- --------- -- --- -- ------ ---- - - - -- - -- -- - - - -- - -- ----------
    -
--

----- ------- - ------ ---- -
-------
    ----- -----------  -- ---------
--

--- ------ -
    ------- -------         -- -- -------- --
    ------- ------ ----     -- -- -------- -- --- --
    ------ --
-

输出结果

本题详细解读

1. 继承构造函数的背景

在C++11之前,如果派生类想要使用基类的构造函数,通常需要在派生类中显式地定义相应的构造函数,并在初始化列表中调用基类的构造函数。这种方式会导致代码重复,尤其是在基类有多个构造函数的情况下。

C++11引入了继承构造函数的概念,允许派生类直接继承基类的构造函数,从而避免了重复代码的问题。

2. 继承构造函数的语法

继承构造函数的语法非常简单,只需要在派生类中使用using声明即可:

这条语句告诉编译器,派生类将继承基类的所有构造函数。编译器会自动为派生类生成相应的构造函数,这些构造函数会调用基类的对应构造函数。

3. 继承构造函数的使用场景

继承构造函数在以下场景中非常有用:

  • 减少代码重复:当基类有多个构造函数时,派生类不需要为每个构造函数重新定义一遍。
  • 简化代码:派生类可以直接使用基类的构造函数,而不需要在派生类中显式地定义构造函数。
  • 提高代码可维护性:当基类的构造函数发生变化时,派生类不需要做任何修改。

4. 注意事项

  • 构造函数的重载:如果派生类中定义了与基类同名的构造函数,那么基类的构造函数不会被继承。
  • 默认构造函数:如果基类没有默认构造函数,而派生类也没有定义任何构造函数,那么派生类将无法使用继承构造函数。
  • 访问控制:继承的构造函数的访问级别与基类中的构造函数相同。如果基类的构造函数是privateprotected,那么派生类中继承的构造函数也将是privateprotected

5. 示例代码解析

在示例代码中,Derived类通过using Base::Base;语句继承了Base类的所有构造函数。因此,Derived类的对象可以直接使用Base类的构造函数进行初始化。

这两行代码分别调用了Base类的两个构造函数,输出结果验证了继承构造函数的正确性。

6. 总结

继承构造函数是C++11中一个非常有用的特性,它允许派生类直接继承基类的构造函数,从而简化了代码并减少了重复。通过使用using声明,派生类可以轻松地继承基类的构造函数,而不需要显式地定义它们。

纠错
反馈