`
SunnyYoona
  • 浏览: 367460 次
社区版块
存档分类
最新评论

[面试珠玑]一道关于C++虚函数和多继承的面试题

 
阅读更多

问题:假设有两个基类A和B,它们有一个相同签名的虚函数void foo(), 但是拥有不同的实现。现在要求创建一个新类C,它同时继承A和B,也有相同的签名的函数void foo(), 并能分别对A和B中的foo函数进行重写(overwrite)。

<wbr><wbr><wbr>已知条件对应的代码如下:</wbr></wbr></wbr>

class A{
    public:
        virtual void foo(){
            cout<<"A::foo()"<<endl;
        }
};
class B{
    public:
        virtual void foo(){
            cout<<"B::foo()"<<endl;
        }
};


现在要求C同时是A和B的子类(可以不是直接子类,在面试时没有想到,这个问题没有回答好),并能重写A和B中foo函数为fooCA和fooCB,使得在使用下面的代码时,foo()函数能够给出不同的输出,以体现出多态性:

int main(){
    C c;
    A* pA = &c;
    B* pB = &c;
    pA->foo();  //这里会输出和A相关的信息
    pB->foo();  //这里会输出和B相关的信息
    return 0;
}
如果C直接继承A和B的话,是上述代码是很难按照预期工作的,因为C的foo()函数不知道怎么写,一个函数的实现很难完成两种功能(通过指针类型判定?应该不行)。因此面试时百思不解,回来后才查了下,发现需要引入中间继承,即采用间接继承的方式,具体做法如下:
class MidA:public A{
    public:
        virtual void fooCA() = 0; //这里的纯虚函数由C负责实现,下同
        virtual void foo(){
            fooCA();
        }
};
class MidB:public B{
    public:
        virtual void fooCB() = 0;
        virtual void foo(){
            fooCB();
        }
};
class C:public MidA, public MidB{
    public:
        virtual void fooCA(){
            cout<<"C::foo() A"<<endl;
        }
        virtual void fooCB(){
            cout<<"C::foo() B"<<endl;
        }
};

以pA->foo()为例,此时A类型的指针pA指向的是C,由于继承的父子关系,它被解释为MidA对象(为什么不是MidB对象?),进而调用MidA中的foo(),然后再经过一层虚函数解析,就调用了C类中的fooCA了。pB->foo()也是类似的。

<wbr><wbr><wbr>实际上,让C直接继承自A和B,然后定义fooCA和fooCB虚函数,分别进行实现,然后通过手动修改C的虚拟函数表,把fooCA的地址放到A对象的虚拟表中,把fooCB放到B对象的虚拟表中。这样,不用引入中间类,也能完成任务,只是这种方法写出的代码很难理解,实用性较差。</wbr></wbr></wbr>



分享到:
评论

相关推荐

    C++珠玑妙算头文件(实用)

    内容概要: 基本都是代码,解释可参见 ...若要使用务必放到文件夹里的正确位置: E:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++ 可更据个人编译软件路径不同调整文件路径。

    《编程珠玑》(Programming Pearls)课本和习题代码实现

    《编程珠玑》(Programming Pearls)课本和习题C++代码实现,包括基本所有课本讲解内容的代码实现,以及大量课后习题的实现。

    编程珠玑习题集锦

    书的内容围绕程序设计人员面对的一...作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的。《编程珠玑(第2版)》是计算机科学方面的经典名著。

    编程珠玑编程珠玑

    编程珠玑编程珠玑

    编程珠玑 编程珠玑 编程珠玑 编程

    我觉得不错,和大家分享! 编程珠玑 编程珠玑 编程珠玑

    编程珠玑源码下载编程珠玑书后源代码

    编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码

    编程珠玑 编程珠玑续

    编程珠玑和编程珠玑续两本,上传赚点分,填充填充填充

    函数式算法设计珠玑 ,理查德·伯德 ,Pg222 ,2017.04_14207960

    函数式算法设计珠玑 ,理查德·伯德 ,Pg222 ,2017.04_14207960

    编程珠玑源代码

    编程珠玑第二版的源代码,里面主要是以C语言和C++为主

    编程珠玑.pdf(字字珠玑)

    相信这本书不用解释吧。。成为高手必备之。字字珠玑。这个可以有

    编程珠玑(续)

    《编程珠玑(续)》是计算机...书中涵盖了程序员操纵程序的技术、程序员取舍的技巧、输入和输出设计以及算法示例,这些内容组成一个有机的整体,如一串串珠玑展示给程序员。  《编程珠玑(续)》适合各级程序员阅读参考。

    编程珠玑.pdf

    编程珠玑.pdf 面试必备,算法必备,各种算法的精彩解析

    《算法珠玑》Java版本 一个最精简的题库

    本书每题都有完整的代码,且每个代码经过千锤百炼,保证可读性的前提下尽可能简短,方面读者在面试中能快速写出来。 每道题都有多种解法。 本书的宗旨是,用尽可能少的题目,覆盖尽可能多的算法。本书中的的每道题都...

    编程珠玑高清PDF

    高清PDF之 编程珠玑, 面试必备~~~~~~啦啦啦啦啦啦

    编程珠玑_第2版_修订版_2015最新

    本书选取了许多具有典型意义的复杂编程和算法问题,生动描绘了历史上众大师们在探索解决方案中发生的轶事、走过的弯路和不断精益求精的历程,引导读者像真正的程序员和软件工程师那样富于创新性地思考,并透彻阐述和...

    编程珠玑(第二版)答案

    编程珠玑(第二版)答案

    程序员面试金典 – 面试题 16.15. 珠玑妙算(map计数)

    珠玑妙算游戏(the game of master mind)的玩法如下。 计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。 例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色...

    编程珠玑第二版及源代码

    编程珠玑第二版及源代码实现(C/C++) 如果让程序员们列举他们喜欢的书籍,Jon Bentley的《编程珠玑》一定可以归于经典之列。如同精美的珍珠出自饱受沙砾折磨的牡蛎,程序员们的精彩设计也来源于曾经折磨他们的实际...

    编程珠玑 第二版 超清中文版 文字版可复制

    正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师Jon Bentley以其独有的洞察力和创造力,从磨砺程序员的实际问题中凝结出一篇篇不朽的编程“珠玑”,成为世界计算机界名刊《ACM通讯》历史上很受欢迎的专栏,...

    编程珠玑续本

    编程珠玑续、编程珠玑续本、编程珠玑续本、编程珠玑续本

Global site tag (gtag.js) - Google Analytics