Что не унаследовано от производного класса C ++?Видимо, оператор = и некоторые конструкторы на самом деле наследуются - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь узнать о наследовании C ++, но одна вещь не имеет для меня никакого смысла.Все, что гуглится о том, что не наследуется производным классом, говорит о том, что конструкторы, friends и 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

Если все конструкторы и оператор = не наследуются, почему называются оператор =, конструктор по умолчанию и конструктор копирования базового класса?

Ответы [ 3 ]

3 голосов
/ 09 апреля 2019

Dervied не имеет конструкторов, в этом случае создается конструктор по умолчанию, который вызывает конструктор по умолчанию для всех базовых классов и членов.

Аналогичные вещи происходят с конструктором копирования и оператором присваивания.Версии базового класса вызываются автоматически генерируемыми версиями производного класса.

Это не имеет ничего общего с наследованием конструкторов или операторов присваивания.

0 голосов
/ 09 апреля 2019

Конструктор копирования / перемещения является исключением согласно стандарту.

Ссылаясь на стандарт:

Для каждого не шаблонного конструктора в наборе кандидатов унаследованных конструкторов, отличных отконструктор, не имеющий параметров, или конструктор копирования / перемещения, имеющий единственный параметр, конструктор неявно объявляется с теми же характеристиками конструктора, если только не существует объявленный пользователем конструктор с той же сигнатурой в полном классе, где появляется объявление using илиКонструктор будет по умолчанию, копировать или перемещать конструктор для этого класса.

PS.Base& operator = (const Base& base) не является конструктором.Это назначение.Так что он работает как любая другая функция-член.Поскольку в вашем примере он является публичным, он наследуется.

0 голосов
/ 09 апреля 2019

Классы не автоматически наследуют конструкторы, хотя вы можете заставить их предоставлять конструкторам базового класса оператор 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=; 
};

Конструктор копирования также не был унаследован. Вместо этого компилятор автоматически сгенерировал конструктор копирования для производного класса. Если все переменные-члены класса и базовые классы являются копируемыми, то сам класс является копируемым, и он автоматически сгенерирует конструктор копирования.

Те же правила применяются к оператору присваивания: если все члены класса предоставляют оператор присваивания копии, компилятор автоматически генерирует его для самого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...