C ++ polymorphism achieved (by virtual inheritance, virtual functions implemented) and virtual destructor, multiple inheritance, and use priority inheritance

#include <stdio.h>
#include <iostream>
using namespace std;
 
#define __MODE1
 
class A
{
public:
    A()
    {
        std::cout << "A" << std::endl;
    }
    virtual ~ A () // virtual destructor, following the Cheng Shizai categories not avoid destructor (some prompts compiler terminated mistakes, such as the MSVC) causes a memory leak
    {
        std::cout << "~A" << std::endl;
    }
    virtual void print () // virtual function, multi-state
    {
        std::cout << "A print" << std::endl;
    }
};
 
class B: virtual public A // virtual inheritance, to resolve conflicts when multiple inheritance of D B, C
{
public:
    B()
    {
        std::cout << "B" << std::endl;
    }
    ~B()
    {
        std::cout << "~B" << std::endl;
    }
    void print()
    {
        std::cout << "B print" << std::endl;
    }
};
 
class C: virtual public A
{
public:
    C()
    {
        std::cout << "C" << std::endl;
    }
    ~C()
    {
        std::cout << "~C" << std::endl;
    }
    void print()
    {
        std::cout << "C print" << std::endl;
    }
};
 
class D: public B, public C // multiple inheritance + multi-level inheritance
{
public:
    D()
    {
        std::cout << "D" << std::endl;
    }
    ~D()
    {
        std::cout << "~D" << std::endl;
    }
    void print()
    {
        std::cout << "D print" << std::endl;
    }
};
 
int main ()
{
    #ifdef __MODE1
    std::cout << "--------------1--------------" << std::endl;
    A *pA, *pB, *pC, *pD;
    A *p = new A;
    p->print();
    pA = p;
    p = new B; // polymorphic application (parent class pointer pointing object subclass)
    p->print();
    pB = p;
    p = new C;
    p->print();
    pC = p;
    p = new D;
    p->print();
    pD = p;
    std::cout << "--------------1析构--------------" << std::endl;
    p = NULL;
    delete pA;
    DOES NOT = NULL;
    delete pB;
    pB = NULL;
    delete pC;
    pC = NULL;
    delete pD;
    pD = NULL;
#else
    std::cout << "--------------2--------------" << std::endl;
    A *p1 = new A;
    p1->print();
    A *p2 = new B;
    p2->print();
    A *p3 = new C;
    p3->print();
    A *p4 = new D;
    p4->print();
    std::cout << "--------------2析构--------------" << std::endl;
    delete p1;
    p1 = NULL;
    delete p2;
    p2 = NULL;
    delete p3;
    p3 = NULL;
    delete p4;
    p4 = NULL;
#endif
    return 0;
}
 
Published 10 original articles · won praise 5 · views 10000 +

Guess you like

Origin blog.csdn.net/Johnable/article/details/104047706