继承:构造与析构
有Child类继承于Parent类

class Childpublic Parent

那么,当创建一个子类对象时:(编译器默认运行)
子类对象构造时,先调用父类的构造函数,再调用子类的构造函数
子类对象析构时,先调用子类的析构函数,再调用父类的构造函数

当父类有多个构造函数,可以显式的调用其中的一个构造函数
如果没有显式调用,则调用了父类的“默认构造函数”

当一个类被继承时,应该将父类的析构函数声明为virtual,否则会有潜在的问题

class Parent
{
    virtual ~Parent(){}//声明为virtual
};

考虑以下场景:

Parent *p=new Child();
delete p;//此时,调用的是谁的析构函数?

如果析构函数没有标识为virtual,则有潜在的隐患,并有可能直接导致程序崩溃,(资源没有被释放,并引申出一系列问题)

类的大小,与virtual关键字的影响
(1)类的大小由成员变量决定,(这struct的原理相同)
类的大小成员函数的个数无关,即使一个类有10000个成员函数,对它所占的内存空间是没有影响的
(2)但是,如果有一个成员函数被声明为virtual,那类的大小会有写微的变化。(这个变化由编译器决定,一般是增加了4个字节)

  1. 介绍继承关系中,父类的构造函数和析构函数将被调用
  2. 当一个类被别的类继承时,应该将父类的析构函数声明为virtual
    (注:如果这个类在设计的时候,已经明确它不会被继承,则不需要声明为virtual)