Это тот конструктор, который вызывается только в случае создания объекта класса? - PullRequest
0 голосов
/ 31 марта 2012

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

Но когда я запускаю этот кусок кода, я вижу следующее: -

#include <iostream>

using namespace std;

class Pet {
public:
    Pet(){cout<<"in base constructor\n";}

    virtual ~Pet() = 0;  //making pet abstract by making drstructor pure virtual
};

Pet::~Pet() {
    cout << "~Pet()" << endl;
}

class Dog : public Pet {
    public:
    Dog(){cout<<"in drvd constructor\n";}

    ~Dog() {
        cout << "~Dog()" << endl;
    }
};

int main() {
    Pet* p = new Dog; // Upcast
    delete p; // Virtual destructor call
    return 0;
}

При компиляции и запуске вывод: -

in base constructor
in drvd constructor
~Dog()
~Pet()

почему вызывается конструктор для Pet, хотя это абстрактный класс и создание объектов для него не разрешено? Так что все сводится к тому, что, наконец, конструктор вызывается только в случае создания объекта?

Ответы [ 3 ]

6 голосов
/ 31 марта 2012

невозможно создать объект абстрактного класса

Не берите этот рекламный ролик. Вы не можете создать объект, фактический тип которого является абстрактным .

Но если вы реализуете этот класс (расширяете его и реализуете все чистые виртуальные методы в нем) и создаете экземпляр нового класса,объект исходного абстрактного базового класса будет создан как часть нового класса.

Наследование - это отношение is-a.Dog является Pet.Когда вы создаете Dog, вы создаете Pet.Но вы не можете создать Pet самостоятельно.

2 голосов
/ 31 марта 2012

Правильным утверждением является то, что «невозможно создать наиболее производный объект абстрактного класса». Но объекты также могут быть базовыми подобъектами более производных объектов, и в этом случае они все еще должны быть построены.

(Объект может быть подобъектом тремя способами: подобъект-член объекта типа класса, базовый подобъект производного объекта типа класса или элемент массива.)

1 голос
/ 31 марта 2012

В вашем примере вы можете создать экземпляр Dog, но не Pet.т.е.

Pet p; //Not possible, as destructor is abstract.
Dog d; //Allowed, because you derived from pet and ~pet( ) is defined.

Общая последовательность: если вы создаете объект целевого класса, конструкторы вызываются в следующем порядке: базовый класс -> дочерний уровень -> ... -> целевой класс.Деструкторы следуют в обратном порядке.

Чтобы визуализировать это, представьте, что целевой класс - это расширенный набор всех его родительских классов.Здесь Собака - это супер набор питомцев.

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