Я писал класс (destructor является виртуальным), объекты которого будут удаляться только с использованием объекта класса recycler. Но я обнаружил, что любой может удалить объект этого класса, не зная моего класса recycler.C++ type casting для получения доступа
Пожалуйста, рассмотрим следующий пример:
class A
{
public:
A() {qDebug() << "cTor: A";}
protected:
virtual ~A() {qDebug() << "dTor: A";}
};
class B
{
public:
virtual ~B() {cout << "dTor: B";}
protected:
B() {cout << "cTor: B";}
};
A *a = new A;
delete (B*)a; // How is this possible !!??
выход:
cTor: A
dTor: A
Если возможно, что я могу сделать, чтобы предотвратить это, не делая окончательный подкласс деструктор A
«s невиртуальном?
'delete (B *) a; // Как это возможно! ?? Это не так. Попробуйте использовать правильный листинг (например, 'static_cast <>'), и вы увидите. –
@ πάντα Да .. Но почему он работает с msvC++ 12 и mingw 4.92? – SaMax
Неопределенное поведение - неопределенное поведение. Ничего действительно _works_. –