只有在程序通过指向基类对象的指针或者基类对象的引用调用虚函数时,才会发生运行时的多态现象。
类设计者的核查表
1.你的类需要一个构造函数吗?
2.你的数据成员是私有的吗? (length的安全性,能否随时表现正确的值,选择一种规范来使用)
3.你的类需要一个无参构造函数吗? (定义一个有参构造函数,不定义无参构造函数来限制类的生成方法)
4.是不是每个构造函数初始化所有的数据成员?(尽量为每一个数据成员设置经过明确定义的值)
5.你的类需要析构函数吗?(该类是否分配了资源,资源会不会由成员函数自动释放)
6.你的类需要一个虚析构函数吗?(绝不会用作基类的类是不需要虚析构函数的)
7.你的类需要复制构造函数吗?(可以把复制构造函数/复制操作符定义为私有的)
8.你的类需要一个赋值操作符吗?(类X的赋值由X::operator=来定义。通常,operator=应该返回一个X&,并且由return *this;结束以保证与内奸的赋值操作符一致)
9.你的赋值操作符能正确的将对象赋给对象本身吗?(源对象和目标对象是同一个时,容易出错)
10.你的类需要定义关系操作符吗?
11.删除数组时你记住了用delete[]吗?(在删除任何类型的数组时使用[]格式是很好的习惯)
12.在复制构造函数和赋值操作符的参数类型中加上const了吗? X::X(const X&) X::operator=(const X&)
13.如果函数有引用参数,它们应该是const引用吗?
14.记得适当地声明成员函数为const的了吗?
【const对象只能调用const成员函数,原因是调用中隐含有this指针,const转非const会报错】
【const成员函数,隐含的this指针也带const】
【构造函数不能为虚函数,首先虚函数是有一个虚函数表的,有一个虚函数表指针。我们现在新建一个类的时候,先分配北村空间,然后用构造函数初始化所有的内容,这里我们构造函数是虚函数,没法构造,也就没法获得虚函数表指针】