Рассмотрим следующий код:
class Base {
public:
#ifdef __VIRTUAL__
virtual ~Base() {}
#else
~Base() {}
#endif
};
class Derived : public Base {
public:
~Derived() {}
private:
static void operator delete(void*) = delete;
};
int main() {
Derived d;
}
Он будет успешно скомпилирован с cmd
g++ -std=c++11 main.cpp
, но не с cmd
g++ -std=c++11 -D__VIRTUAL__ main.cpp
Выходные данные показываютoperator delete
требуется
main.cpp: In destructor ‘virtual Derived::~Derived()’:
main.cpp:12:17: error: use of deleted function ‘static void Derived::operator delete(void*)’
~Derived() {}
^
main.cpp:14:17: error: declared here
static void operator delete(void*) = delete;
^
main.cpp: In destructor ‘virtual Derived::~Derived()’:
main.cpp:12:17: error: use of deleted function ‘static void Derived::operator delete(void*)’
~Derived() {}
^
main.cpp:14:17: error: declared here
static void operator delete(void*) = delete;
^
Это означает, что если я использую функцию виртуального деструктора, я не могу удалить operator delete
.
Почему это произошло, почему виртуальному деструктору необходим глобальный operator delete
, даже если он создан в стеке.