#include <iostream>
class A
{
public:
A() { std::cout << "A" << std::endl; }
virtual ~A() { std::cout << "~A" << std::endl; }
virtual void Test() { std::cout << "A::Test" << std::endl; }
};
class B
{
public:
B() { std::cout << "B" << std::endl; }
~B() { std::cout << "~B" << std::endl; }
};
class C : public A
{
public:
C() { std::cout << "C" << std::endl; }
~C() { std::cout << "~C" << std::endl; }
void Test() { std::cout <<"C::Test" << std::endl; }
private:
B _b;
};
int main(void)
{
C c;
return 0;
}
实例化一个派生类对象:
构造
1.执行基类的构造函数;
2.初始化派生类的成员变量,由于B是一个类类型,所以会调用B的默认构造函数,此时如果B没有不带参数(或默认参数)的构造函数会报错;
3.执行派生类的构造函数。
析构
与构造顺序相反
执行结果:
A
B
C
~C
~B
~A
int main(void)
{
A *pa = new C();
pa->Test();
delete pa;
return 0;
}
构造和析构顺序与上类似,不过需要注意的是基类A的析构函数必须声明为virtual,否则派生类得不到析构
执行结果:
A
B
C
C::Test
~C
~B
~A