Информация об изменениях

Сообщение Re[2]: нужно ли декларировать виртуальный деструктор от 27.04.2024 23:42

Изменено 28.04.2024 0:08 rg45

Re[2]: нужно ли декларировать виртуальный деструктор
Здравствуйте, fk0, Вы писали:

fk0> Его и не получится не декларировать, если он нужен в конкретном наследнике.


Получится. Если деструктор базового класса объявлен виртуальным, то деструкторы всех производных классов также будут виртуальными, независимо от того, как они объявлены:

http://coliru.stacked-crooked.com/a/dfcf2add921ddd7b

#include <iostream>
#include <memory>

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

class Derived : public Base
{
public:
    /*virtual*/ ~Derived(){ std::cout << "~Derived()" << std::endl; } /*override*/
};

int main()
{
    std::shared_ptr<Base> p = std::make_shared<Derived>();
}

g++ -std=c++20 -O2 -Wall -Wno-non-template-friend -pedantic -pthread main.cpp && ./a.out
~Derived()
~Base()
Re[2]: нужно ли декларировать виртуальный деструктор
Здравствуйте, fk0, Вы писали:

fk0> Его и не получится не декларировать, если он нужен в конкретном наследнике.


Получится. Если деструктор базового класса объявлен виртуальным, то деструкторы всех производных классов также будут виртуальными, независимо от того, как они объявлены:

http://coliru.stacked-crooked.com/a/235da121d2be076f

#include <iostream>
#include <memory>

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

class Derived : public Base
{
public:
    /*virtual*/ ~Derived(){ std::cout << "~Derived()" << std::endl; } /*override*/
};

int main()
{
    std::unique_ptr<Base> p(new Derived());
}

g++ -std=c++20 -O2 -Wall -Wno-non-template-friend -pedantic -pthread main.cpp && ./a.out
~Derived()
~Base()