#include <stdio.h>
#include <iostream>
using namespace std;
#define __MODE1
class A
{
public:
A()
{
std::cout << "A" << std::endl;
}
virtual ~A()// 虚析构函数,避免继承时子类未析构(有的编译器会提示段错误而终止,如MSVC)导致内存泄漏
{
std::cout << "~A" << std::endl;
}
virtual void print()// 虚函数,实现多态
{
std::cout << "A print" << std::endl;
}
};
class B: virtual public A// 虚继承,解决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// 多重继承+多级继承
{
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;// 多态的应用(父类的指针指向子类的对象)
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;
pA = 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;
}