Почему мой код делает два экземпляра вместо одного? - PullRequest
2 голосов
/ 12 апреля 2020

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

#include <iostream>

class Mother {
public:
    static int instance;
    Mother() {
        std::cout << "Mother constructor" << std::endl;
        instance++;
    }

    int get_instance() {
        return instance;
    }
};

class Child : public Mother {
public:
    Child() {
        std::cout << "Child constructor" << std::endl;
        this->instance++;
    }
};

int Mother::instance = 0;

int main() {
    Child child;
    std::cout << "instance: " <<  Mother::instance << std::endl;
}

консольный возврат

clang++  -std=c++11 -Wconversion *.cpp && ./a.out
Mother constructor
Child constructor
instance<int>: 2

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Класс Child наследует от Mother - т. Е. Mother - это базовый класс из Child. Поэтому, когда вы создаете экземпляр объекта Child, также вызывается конструктор Mother, и это происходит до того, как будет выполнено тело конструктора Child.

В вашем коде оба * 1014 Конструкторы * и Child увеличивают элемент данных stati c instance на один, поэтому после построения child значение instance равно двум вместо одного. Чтобы получить желаемое поведение, просто не изменяйте instance в Child::Child():

class Child: public Mother {
public:
    Child() { std::cout << "Child constructor" << std::endl; }
};
0 голосов
/ 12 апреля 2020

Когда создается child, сначала вызывается конструктор Mother и выполняется instance++, затем вызывается конструктор Child и снова выполняется instance++. Вот почему вы получаете 2.

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