网站登录按纽是灰色的,做网站的前途怎么样,网站制作价格公司,网站界面设计材料收集1. 什么是多态#xff1f;
多种形态#xff0c;不同的对象来完成同一行为#xff0c;会产生不同的行为或状态。多态的构成有两个条件#xff1a;必须通过基类的指针或引用来调用虚函数#xff1b;被调用的函数必须是虚函数#xff0c;且派生类要对这个虚函数进行重写。 …1. 什么是多态
多种形态不同的对象来完成同一行为会产生不同的行为或状态。多态的构成有两个条件必须通过基类的指针或引用来调用虚函数被调用的函数必须是虚函数且派生类要对这个虚函数进行重写。
2. 什么是重载、重写(覆盖)、重定义(隐藏)
重载和重写都是多态的一种。函数重载是静态的多态重载函数是指在同一定义域内函数名相同参数返回值不同的函数即同一个函数可以做不同的事虚函数重写是动态的多态派生类重写虚函数后父类的指针或引用通过调用不同的虚函数实现不同的功能。
3. 多态的实现原理
当一个类中定义了虚函数后类中会增加一个指针叫虚函数表指针指向虚函数表虚函数表中存着虚函数的地址通过虚函数表指针找到虚函数表即可访问虚函数。
具体参考本文 http://t.csdnimg.cn/p7cCX
4. inline函数可以是虚函数吗
可以不过编译器就忽略inline属性这个函数就不再是内联函数因为虚函数地址要放到虚表中去编译阶段就要在内联函数的代码处对内联函数进行展开虚函数虽然在编译阶段就生成存在代码段中但是虚函数表指针在类的初始化阶段才进行初始化的。
5. 静态成员可以是虚函数吗
不能因为静态成员函数没有this指针使用类型::成员函数的调用方式无法访问虚函数表所以静态成员函数无法放进虚函数表。
6. 构造函数可以是虚函数吗
不能因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。
7. 析构函数可以是虚函数吗什么场景下析构函数是虚函数
可以并且最好把基类的析构函数定义成虚函数。对于某些场景。虚构函数是虚函数可以更好的释放空间
8. 对象访问普通函数快还是虚函数更快
首先如果是普通调用即虚函数没有构成多态是一样快的。如果是多态调用则调用的普通函数快因为构成多态运行时调用虚函数需要到虚函数表中去查找。
9. 虚函数表是在什么阶段生成的存在哪的
虚函数表是在编译阶段就生成的一般情况下存在代码段(常量区)的。
10. C菱形继承的问题
菱形继承的问题是由多重继承的父类祖先是同一个父类导致的。由于祖先是一个父类在继承时都会将这个父类的成员继承过来所以在派生类中会有数据冗余和成员访问二义性的问题。
解决方案虚继承在继承同一个祖先父类的时候采用虚继承各添加一个虚基表指针指向虚基表这个虚基表中存着各对象相对于公共成员的偏移量各对象可以通过这个偏移量来找到公共成员进而访问同一份数据对于继承公共父类祖先的两个类负担仅仅是多存了两个指针而已。
具体参考虚继承解决菱形继承的原理
注意不要把多态中的虚函数表和虚继承中的虚基表搞混了。
11. 什么是抽象类抽象类的作用
当一个类中定义了纯虚函数的时候这个类就被叫做抽象类。抽象类中的纯虚函数如果不经过派生类重写就无法实例化出对象
所用抽象类强制重写了虚函数另外抽象类体现出了接口继承关系。