In C++11, we are able to declare a destructor to be auto generated:
struct X { virtual ~X() = default; };
Also, we can declare a destructor to be pure virtual:
struct X { virtual ~X() = 0; };
My question is: how to declare the destructor to be both auto generated and pure virtual? Looks like the following syntax is not correct:
struct X { virtual ~X() = 0 = default; };
Neither is this one:
struct X { virtual ~X() = 0, default; };
Nor this one:
struct X { virtual ~X() = 0 default; };
EDIT: Some clarification on the purpose of the question. Basically I want an empty class to be non-instantiable base class, but derived class is instantiable, then the class must have a pure virtual destructor. But on the other hand, I don't want to provide the definition in a .cpp file. So I need some sort of mechanism equivalent to default
. I wonder if anyone has an idea to solve the problem.
The destructor is not user-provided (meaning, it is implicitly-defined or defaulted) The destructor is not virtual (that is, the base class destructor is not virtual) All direct base classes have trivial destructors. All non-static data members of class type (or array of class type) have trivial destructors.
The default destructor calls the destructors of the base class and members of the derived class. The destructors of base classes and members are called in the reverse order of the completion of their constructor: The destructor for a class object is called before destructors for members and bases are called.
A pure virtual destructor can be declared in C++. After a destructor has been created as a pure virtual object(instance of a class), where the destructor body is provided. This is due to the fact that destructors will not be overridden in derived classes, but will instead be called in reverse order.
A virtual destructor is used to free up the memory space allocated by the derived class object or instance while deleting instances of the derived class using a base class pointer object.
In order to define a pure virtual method, you need a separate definition from the declaration.
Therefore:
struct X { virtual ~X() = 0; }; X::~X() = default;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With