class A
{
public:
A(…) {…}
virtual ~A() {…}
private:
// may contains data
};
class B : public A
{
public:
B(…) {…}
private:
// contains no data
};
class C : public B
{
public:
C(…) {…}
~C() {…}
private:
// may contains data
};
As you can see, class A is the base class so we have to provide a implemented virtual destructor.
Question> Do we have to provide a default destructor for a concrete class B?
class B itself doesn’t require to implement a customized destructor to release any allocated resource.
Thank you
No. Once one base destructor is virtual, all derived destructors are automatically virtual. If the default implementation suffices, you do not need to provide a user-defined destructor.
(In fact, if the default implementation suffices even in the base, you should declare and define it as
virtual ~A() = default;, rather than with an empty body.)