Как правильно наследовать от базового класса, деструктор которого не является виртуальным?

Я хочу наследовать от класса А, но деструктор А не является виртуальным, и я не могу изменить определение А. Как избежать следующего случая?

struct A
{
A()
: a(new char[8])
{}

~A()
{
delete[] a;
}

char* a;
}

struct B : A
{
B()
: A(), b(new char[8])
{}

~B()
{
delete[] b;
}

char* b;
};

int main()
{
A* p_a = new B;
delete p_a; // How to avoid such a dangerous deletion?
}

1

Решение

Если базовый класс не имеет виртуального деструктора и вы не можете изменить определение класса, вам почти не повезло. Как правило, вам не следует использовать публичное наследование с базовым классом, в котором нет виртуального деструктора.

Может быть, вы можете попробовать использовать композицию вместо наследования? Поместите экземпляр A в Bи предоставляют открытые функции-члены, которые обертывают вызовы к функциям-членам A,

8

Другие решения

Ты можешь использовать struct B : private A чтобы A недоступная база B,

1

Просто сделай A член данных вместо базового класса.


Кстати, занятия нарушают правило трех, что является приглашением к катастрофе. Что делать, если экземпляр скопирован. Лучше использовать стандартные библиотечные контейнеры вместо явных new а также delete,

0
По вопросам рекламы [email protected]