1.类的多态性原理(虚函数表)
在C++11中可以使用override关键字验证是否覆盖成功
拥有虚函数的类,会拥有一份虚函数表,此类中所有的对象共享这一张表,这些对象内部会增加一个隐藏的成员变量:虚函数表指针,指向虚函数表。可以使用sizeof运算符观察此指针的存在
当派生类继承了拥有虚函数的基类后,也会继承虚函数表,如果此时派生类覆盖了基类中的虚函数,则会修改这样表的内容为新的函数内容
如果派生类中新增了新的虚函数,则会在表的尾部新增此函数
每个类型对象的虚函数表指针都指向自己类的虚函数表。因此代码在运行阶段,可以通过查询这个虚函数表,来找到对应的类型应该调用的函数地址。\n多态与继承一样,提高了代码的编码效率,牺牲了一部分执行效率。
2.关于在类的使用中new带不带括号的问题
B是一个类:
1)new B
如果不加括号,用户自定义了默认构造函数,new创建对象的时候会调用自定义的默认构造函数;用户没有自定义默认构造函数,new创建的对象就不会初始化(申请内存后不置零).
2)new B()
带括号不带参数的话,如果用户自定义了默认构造函数,new创建出的对象就会调用默认构造函数进行初始化,如果用户没有自定义默认构造函数,系统就会调用系统默认构造函数对new出来的对象进行初始化。
3)new B(参数)
带括号带参数,如果类中用户自定义了带参数的构造函数,就可以在括号里带参数进行初始化。
总结:最好不要用不带括号的new。
下面是网上的文章里的结论和证明的代码,方便理解