using namespace std;
class ClassA
{
public:
ClassA() {cout << "ClassA()\r\n";}
~ClassA() {cout << "~ClassA()\r\n";}
void F1() {cout << "ClassA::F1()\r\n";}
virtual void F2() {cout << "ClassA::F2()\r\n";}
};
class ClassB : public ClassA
{
public:
ClassB() {cout << "ClassB()\r\n";}
~ClassB() {cout << "~ClassB()\r\n";}
void F1() {cout << "ClassB::F1()\r\n";}
void F2() {cout << "ClassB::F2()\r\n";}
};
void main(int argc, _TCHAR* argv[])
{
ClassA* pA = new ClassB();
pA->F1();
pA->F2();
delete pA;
cout << "\r\n";
ClassB B;
B.F1();
B.F2();
ClassB() // 再调用B的构造函数
ClassA::F1()
ClassB::F2()
~ClassA() // 调用A的析构函数
ClassA()
ClassB()
ClassB::F1()
ClassB::F2()
~ClassB() // 先调用B的析构函数
~ClassA() // 再调用A的析构函数
class ClassA
{
public:
ClassA() {cout << "ClassA()\r\n";}
~ClassA() {cout << "~ClassA()\r\n";}
void F1() {cout << "ClassA::F1()\r\n";}
virtual void F2() {cout << "ClassA::F2()\r\n";}
};
class ClassB : public ClassA
{
public:
ClassB() {cout << "ClassB()\r\n";}
~ClassB() {cout << "~ClassB()\r\n";}
void F1() {cout << "ClassB::F1()\r\n";}
void F2() {cout << "ClassB::F2()\r\n";}
};
void main(int argc, _TCHAR* argv[])
{
ClassA* pA = new ClassB();
pA->F1();
pA->F2();
delete pA;
cout << "\r\n";
ClassB B;
B.F1();
B.F2();
}
结果输出:
ClassA() // 先调用A的构造函数
ClassB() // 再调用B的构造函数
ClassA::F1()
ClassB::F2()
~ClassA() // 调用A的析构函数
ClassA()
ClassB()
ClassB::F1()
ClassB::F2()
~ClassB() // 先调用B的析构函数
~ClassA() // 再调用A的析构函数
2、如果析构函数定义为虚函数(类A中析构函数为:virtual~ClassA() {cout << "~ClassA()\r\n";}),则输出:
ClassA() // 先调用A的构造函数
ClassB() // 再调用B的构造函数
ClassA::F1()
ClassB::F2()
~ClassB() // 先调用B的析构函数
~ClassA() // 再调用A的析构函数
ClassA()
ClassB()
ClassB::F1()
ClassB::F2()
~ClassB() // 先调用B的析构函数
~ClassA() // 再调用A的析构函数