什么不继承给C ++派生类?显然,operator =和一些构造函数实际上是继承的

时间:2019-04-08 21:17:34

标签: c++ c++11 inheritance constructor

我正在尝试学习C ++继承,但是一件事对我来说没有任何意义。 关于派生类未继承的内容的所有搜索结果表明,构造函数,friend和operator =均未继承。但是,此信息与我的程序的结果不符。

我做了一个继承的例子,结果如下:

#include <iostream>
using namespace std;

class Base
{
public:
  Base()
  {
    cout << "constructor base class without parameters" << endl;
  }

  Base(int a)
  {
    cout << "constructor base class with int parameter" << endl;
  }

  Base(const Base& b)
  {
    cout << "copy constructor base class" << endl;
  }

  Base& operator= (const Base& base)
  {
    cout << "operator= base class" << endl;
  }
};

class Derived: public Base
{
};

int main()
{
  Derived d;

  cout << endl << "here 1" << endl << endl;

  Derived d2 = d;

  cout << endl << "here 2" << endl << endl;

  d = d2;

  //Derived d3 (3); // ERROR!!
}

输出为:

constructor base class without parameters                                                                                                           

here 1                                                                                                                                              

copy constructor base class

here 2                                                                                                                                              

operator= base class

如果不是所有的构造函数和operator =都继承,为什么调用operator =,基类的默认构造函数和副本构造函数?

3 个答案:

答案 0 :(得分:3)

Dervied没有构造函数,在这种情况下,将生成一个默认构造函数,该构造函数将调用所有基类和成员的默认构造函数。

类似的事情发生在复制构造函数和赋值运算符上。自动生成的派生类版本将调用基类版本。

这与构造函数或赋值运算符的继承无关。

答案 1 :(得分:0)

不要自动继承构造函数,尽管您可以强制它们向基类的构造函数提供using语句:

class Derived: public Base
{
   public:
    // Force this class to provide the base class's constructors
    using Base::Base; 
    // Force this class to provide the base class's assignment operator
    using Base::operator=; 
};

复制构造函数也不被继承。相反,编译器会自动为派生类生成一个副本构造函数。如果一个类的所有成员变量和基类都是可复制的,则该类本身是可复制的,它将自动生成复制构造函数。

相同的规则适用于赋值运算符:如果类的所有成员都提供了副本赋值运算符,则编译器会自动为该类本身生成一个。

答案 2 :(得分:-1)

复制/移动构造函数是根据标准的例外。

参考标准

  

对于候选集合中的每个非模板构造函数继承   没有参数或没有参数的构造函数以外的构造函数   复制/移动具有单个参数的构造函数,构造函数为   隐式声明具有相同的构造函数特性,除非   在用户声明的构造函数中,具有相同的签名   出现使用声明或构造函数的完整类   将是该类的默认,复制或移动构造函数。

PS。 Base& operator = (const Base& base)不是构造函数。是分配。因此,它的工作原理与其他任何成员函数一样。由于在您的示例中它是公开的,因此它是继承的。

相关问题