C++-多态常见试题的总结
关于C++多态的介绍:C++-多态-CSDN博客
1.
A.只有类的成员方法才可以被virtual修饰,其他的函数并不可以
B.正确
C.virtual关键字只在声明时加上,在类外实现时不能加
D.static和virtual是不能同时使用的
2.
A.多态分为编译时多态和运行时多态,也叫早期绑定和晚期绑定
B.编译时多态是早期绑定,主要通过重载实现
C.模板属于编译时多态,故错误
D.运行时多态是动态绑定,也叫晚期绑定
3.
A.正确,重写又叫覆盖,重定义又叫隐藏
B.重载的条件第一个就是在同一个作用域中
C.重载的要求是在同一个作用域中两个同名函数的参数个数不同,参数类型不同,参数顺序不同。
重写是在继承的体系中,虚函数 + 三同
重定义是在继承的体系中,在派生类中出现同基类同名的成员方法,就会对基类中同名的进行隐藏也就是重定义。
D.重写又称覆盖,和重定义不同,在继承的体系中,基类和派生类中的同名函数不是重写就是重定义。
E.同D。
F.重写需要虚函数所以确实比重定义的条件更加严格。
G.6.
4.
A.使用父类对象调用的方法永远是父类的方法
B.正确
C.重载不涉及子类
D.
5.
A.友元函数不属于成员函数,不能成为虚函数
B.静态成员函数就不能设置为虚函数
C.静态成员函数与具体对象无关,属于整个类,核心关键是没有隐藏的this指针,可以通过类名::成员函数名 直接调用,此时没有this无法拿到虚表,就无法实现多态,因此不能设置为虚函数
D.尤其是父类的析构函数强力建议设置为虚函数,这样动态释放父类指针所指的子类对象时,能够达到析构的多态
6.
A.必须是父类的函数设置为虚函数
B.必须通过父类的指针或者引用才可以,子类的不行
C.不是在编译期,而应该在运行期间,编译期间,编译器主要检测代码是否违反语法规则,此时无法知道基类的指针或者引用到底引用那个类的对象,也就无法知道调用那个类的虚函数。在程序运行时,才知道具体指向那个类的对象,然后通过虚表调用对应的虚函数,从而实现多态。
D.正确,实现多态是要付出代价的,如虚表,虚表指针等,所以不实现多态就不要有虚函数了
7.
A.错误,构成重写是子类重写父类的virtual函数,
B.f3构成重写,重写时子类可以不要求加virtual关键字
C. 选择题一定要扣字眼,题目前半句说的是基类引用 引用了子类对象,但是后半句调用虚函数时,说的是基类的对象调用f2,通过对象调用时编译期间就直接确定调用那个函数了,不会通过虚表以多态方式调用
D.正确
8.
A.多继承的时候,就会可能有多张虚表
B.父类对象的虚表与子类对象的虚表没有任何关系,这是两个不同的对象
C.虚表是在编译期间生成的
D.一个类的不同对象共享该类的虚表,可以自行写代码验证之
9.
虽然子类重写了父类的虚函数,但只要是用对象去调用,则只能调用相对类型的方法,故B正确
10.
分析:new B时先调用父类A的构造函数,执行test()函数,在调用func()函数,由于此时还处于对象构造阶段,多态机制还没有生效,所以,此时执行的func函数为父类的func函数,打印0,构造完父类后执行子类构造函数,又调用test函数,然后又执行func(),由于父类已经构造完毕,虚表已经生成,func满足多态的条件,所以调用子类的func函数,对成员m_iVal加1,进行打印,所以打印1, 最终通过父类指针p->test(),也是执行子类的func,所以会增加m_iVal的值,最终打印2, 所以答案为C 0 1 2
11.
A.父类对象和子类对象的前4字节都是虚表地址
B.A类对象和B类对象前4个字节存储的都是虚表的地址,只是各自指向各自的虚表
C.不相同,各自有各自的虚表
D.A类和B类不是同一类内容不同
12.
A.D类有几个父类,如果父类有虚函数,则就会有几张虚表,自身子类不会产生多余的虚表,所以只有2张虚表
B.正确
C.子类自己的虚函数只会放到第一个父类的虚表后面,其他父类的虚表不需要存储,因为存储了也不能调用
D.错误
13.
A.正确
B.虽然子类函数为私有,但是多态仅仅是用子类函数的地址覆盖虚表,最终调用的位置不变,只是执行函数发生变化
C.不强制也可以直接赋值,因为赋值兼容规则作出了保证
D.编译正确