Base class destructor plus Virtual

The following content will explain two issues: 1. Why add Virtual to the destructor of the base class—to prevent memory leaks

  1. The base class virtual function is not virtual, and the derived class cannot be destructed, which will cause memory leaks

#include <stdio.h>

class Base
{
    
    
public:
    int a;
    Base(){
    
    
        a=0;
    }

    ~Base(){
    
    
        printf("base delete");
    }

    virtual void setA()=0;
};

 

class A:public Base
{
    
    
public:
    A(){
    
    
        a = 10;
    }

    ~A(){
    
    
        printf("A class delete\n");
    }

    virtual void setA()
    {
    
    
        a = 2;
    }

};

class B:public Base
{
    
    
public:
    B(){
    
    
        a=20;
    }

    ~B(){
    
    
        a=-20;
    }

    virtual void setA()
    {
    
    
        a = 3;
    }
};

int main()
{
    
    
    Base *ax = new A();
    Base *bx = new B();
    Base *aClass =  ax;
    Base *bClass = bx;
    printf("a value of a construct %d\n", aClass->a);
    printf("a value of b construct %d\n", bClass->a);
    
    aClass->setA();
    bClass->setA();
    printf("a value of a %d\n", aClass->a);
    printf("a value of b %d\n", bClass->a);
    delete aClass;
    return 0;
}

Insert picture description here
2. If you add Virtual before the base class destructor

class Base
{
    
    
public:
    int a;
    Base(){
    
    
        a=0;
    }
    virtual ~Base(){
    
    
        printf("base delete");
    }
    virtual void setA()=0;
};

Insert picture description here

Guess you like

Origin blog.csdn.net/Interesting1024/article/details/109211648