• virtual不可用于修饰函数:构造函数、static函数(不可同时使用)、inline函数(inline将被忽略)

  • virtual修饰析构函数:对一个基类指针delete,将只会调用基类析构函数,而不调用派生类析构函数,可能造成内存泄漏。解决方法:用virtual修饰 基类析构函数,将会执行基类和派生类的析构函数

  • 一个函数一旦声明为虚函数,那么不管你是否加上virtual 修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual 修饰符。

  • 静态函数不属于任何一个类的实例,在类被加载的时候,静态函数就会被创建,他的调用是通过类名调用的

  • 先执行基类构造函数,再执行派生类构造函数。析构过程调用顺序相反。

  • 类的数据成员在析构函数执行完毕之前不会被释放

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class B
    {
    ~B() {};
    }
    class A
    {
    public:
    ~A() {};
    private:
    B m_x;
    };

以上代码在销毁A的实例化对象时,会先执行完毕A::A(),再执行B::B()

RTTI

  • dynamic_cast<type>(expression) 只能用于指针或引用。
    • 对指针转换失败,则返回空指针(传入空指针,会抛出std::bad_typeid异常)
    • 对引用转换失败,则抛出std::bad_cast异常
  • typeid(expression) 返回一个std::type_info的class instance`.
    • 传入空指针,则抛出std::bad_typeid异常
    • 判断类型:typeid(a) == typeid(b)
  • 一般地讲,能用虚函数解决的问题就不要用 dynamic_cast,能够用 dynamic_cast 解决的就不要用 typeid