快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

EffectiveC++2eItem43(2)

                 A   virtual void mf();
                 /\
                /  \
               /    \
              B    C   virtual void mf();
               \    /
                \  /
                 \/
                 D

    根据以前的讨论,你会认为下面有二义:

    D *pd = new D;
    pd->mf();                      // A::mf或者C::mf?

    该为D的对象调用哪个mf呢,是直接从C继承的还是间接(通过B)从A继承的那个呢?答案取决于B和C如何从A继承。具体来说,如果A是B或C的非虚基类,调用具有二义性;但如果A是B和C的虚基类,就可以说C中mf的重定义优先度高于最初A中的定义,因而通过pd对mf的调用将(无二义地)解析为C::mf。如果你坐下来仔细想想,这正是你想要的行为;但需要坐下仔细想想才能弄懂,也确实是一种痛苦。

    也许至此你会承认MI确实会导致复杂化。也许你认识到每个人其实都不想使用它。也许你准备建议国际C++标准委员会将多继承从语言中去掉;或者至少你想向你的老板建议,全公司的程序员都禁止使用它。

    也许你太性急了。

    请记住,C++的设计者并没有想让多继承难以使用;恰恰是,想让一切都能以更合理的方式协调工作,这本身会带来某些复杂性。上面的讨论中你会注意到,这些复杂性很多是由于使用虚基类引起的。如果能避免使用虚基类 ---- 即,如果能避免产生那种致命的钻石形状继承图 ---- 事情就好处理多了。

    例如,条款34中讲到,协议类(Protocol class

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论