Правила автоматической генерации специальных функций-членов в Effective Modern C ++ четко объяснены Скоттом Мейерсом, пункт 17, стр.109.
В двух словах, когда вы переопределяете / переопределяете конструктор, тогдавам нужно определить все необходимые конструкторы.Поскольку вы удалили конструктор копирования, вам необходимо определить конструктор по умолчанию для базового класса.Это происходит потому, что вы используете конструктор по умолчанию при определении производного класса.
Этот код struct abstract_connection : connection {...};
(без какой-либо информации) означает, что вы, скорее всего, инициализируете abstract_connection
, используя ctor по умолчанию изconnection
.Но ctor по умолчанию из connection
не определен.
Более того, вам нужно определить свой dtor, даже если он считается виртуальной функцией.Код ниже компилируется и запускается здесь .
struct connection
{
connection() = default;
connection(const connection &) = delete;
auto operator=(const connection &) -> connection & = delete;
virtual ~connection() = 0;
};
connection::~connection()
{}
struct abstract_connection : connection
{
abstract_connection() : connection()
{}
~abstract_connection() = default;
};
int main()
{
abstract_connection foo;
}