Я хочу наследовать от класса А, но деструктор А не является виртуальным, и я не могу изменить определение А. Как избежать следующего случая?
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?
}
Если базовый класс не имеет виртуального деструктора и вы не можете изменить определение класса, вам почти не повезло. Как правило, вам не следует использовать публичное наследование с базовым классом, в котором нет виртуального деструктора.
Может быть, вы можете попробовать использовать композицию вместо наследования? Поместите экземпляр A
в B
и предоставляют открытые функции-члены, которые обертывают вызовы к функциям-членам A
,
Ты можешь использовать struct B : private A
чтобы A
недоступная база B
,
Просто сделай A
член данных вместо базового класса.
Кстати, занятия нарушают правило трех, что является приглашением к катастрофе. Что делать, если экземпляр скопирован. Лучше использовать стандартные библиотечные контейнеры вместо явных new
а также delete
,