2016-11-14 15 views
1

Создание абстрактного класса состоит в том, чтобы сделать одну из своих функций-членов чистой виртуальной функцией.Почему мы не обязаны реализовывать чистый виртуальный деструктор?

Создание класса абстрактных обязывает детей класса реализовать базовую чистую виртуальную функцию.

Мы можем даже сделать деструктор базового класса чистым, и этого достаточно, чтобы быть абстрактным классом.

вопрос:

  • почему мы не обязаны реализовать деструктор чисто виртуальную базу в нашем производном классе?

  • Это означает, что если C++ добавляет к нам четыре функции-члена по умолчанию: конструктор, конструктор копирования, назначение и деструктор, нам не нужно реализовывать его в нашем производном классе?

например:

#include <iostream> 
using namespace std; 

class Base 
{ 
    public: 
     Base(){cout << "Base Ctor" << endl;} 
     virtual ~Base() = 0 {cout << "Virtual base dtor" << endl; } 
}; 

class Derived : public Base 
{ 
    public: 
     Derived(){cout << "Derived Ctor" << endl;} 
     // virtual ~Derived() {cout << "Virtual Derived dtor" << endl; } 
}; 

int main() 
{ 

    Base* theBase = new Derived; 
    delete theBase; 

    cout << endl; 


    cout << endl << endl; 
    return 0; 
} 
  • Я знаю, что я должен добавить дочерний деструктор, чтобы освободить память, если она распределяется динамически.

ответ

7

Почему мы не обязаны внедрять деструктор чистой виртуальной базы в наш производный класс?

Поскольку деструкторы не переопределены.

Чтобы помнить об этом, подумайте об именах: ~Base и ~Derived - это не то же самое. Конструкторы и деструкторы вместо того, чтобы работать через переопределение, вместо этого вызываются в цепочке: выполняется самый деструктор в нижней части, а затем он вызывает свой родительский деструктор, который затем запускается, а затем вызывает его родительский деструктор и т. Д.

И вот почему вы должен обеспечить тело деструктора, если вы хотите удалить экземпляр одного из производных классов, даже если он помечен как чистый виртуальный: ему нужно тело, которое нужно вызвать при достижении его в цепочке деструкторов.

Итак, с чем вы столкнулись с виртуальными деструкторами? Это делается для того, чтобы компилятор знал, чтобы вызвать самый нижний деструктор, когда он сталкивается с уничтожением какого-либо класса. Таким образом, разрушение использует виртуальную таблицу, просто он запускает деструктор родительского класса после того, как производный деструктор сделан, поэтому он не является стандартным переопределением.

Это означает, что C++ добавляет к нам четыре функции-члена по умолчанию: конструктор, конструктор копирования, назначение и деструктор, нам не нужно реализовывать его в нашем производном классе?

Не совсем понял вопрос, но в любом случае методы, созданные по умолчанию, не создаются чистым виртуальным и могут быть созданы в каждом классе цепочки наследования.

 Смежные вопросы

  • Нет связанных вопросов^_^