#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;
}