C ++ (классы и указатели) - PullRequest
       1

C ++ (классы и указатели)

0 голосов
/ 21 сентября 2018
#include <iostream>

class Base {
    virtual void method() {std::cout << "from Base" << std::endl;}
public:
    virtual ~Base() {method();}
    void baseMethod() {method();}
};

class A : public Base {
    void method() {std::cout << "from A" << std::endl;}
public:
    ~A() {method();}
};

int main(void) {
    Base* base = new A;
    base->baseMethod();
    delete base;
    return 0;
}

Я не могу понять, почему вывод этого кода: из A из A из Base

Технически он должен печатать только "из A".

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

Это называется Upcast , взгляните на пример в ссылке для получения дополнительной информации.Первое «из A» происходит при выполнении:

 base->baseMethod();

Второе «из A», когда вызывается деструктор A, и «from Base» печатается, когда вызывается деструктор Base.

0 голосов
/ 22 сентября 2018

Когда мы вызываем base->baseMethod(), он вызывает Base::baseMethod, поскольку он не переопределяется на class A.baseMethod вызывает функцию method, так как base является указателем class A, она вызывает A::method, поскольку она переопределена.Хотя этот метод является закрытым, он следует полиморфному поведению.

Когда выполняется delete base, вызывается первый деструктор производного класса, потому что деструктор Base class является виртуальным.Производный деструктор класса назовите его собственной method функцией.Если у нас не было виртуального деструктора, то деструктор производного не был вызван, и, следовательно, вы видели только один from A в качестве выходного значения из базы

После этого он вызывает деструктор базового класса, и это вызывает method function из Base class только потому, что производный класс уже уничтожен.

0 голосов
/ 21 сентября 2018

base - это объект типа A, поэтому base-> baseMethod () будет вызывать реализацию метода виртуального метода A (), печатается "from A", метод () вызывается из d'ors of A и base,При удалении объекта в cpp вызывается его d'tor, а сразу после этого вызывается базовый класс d'tor (противоположность при создании объекта), поэтому выводится «from A» «from base».

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