C++中的动态继承

Posted

技术标签:

【中文标题】C++中的动态继承【英文标题】:dynamic inheritance in C++ 【发布时间】:2011-11-05 18:17:42 【问题描述】:

在面试中我遇到了关于动态继承的问题,但我从未在 C++ 中使用过动态继承。 我想知道我们如何在C++中实现动态继承以及动态继承在C++语言中的实际用途是什么?

【问题讨论】:

Google 给出了几个很好的主题。 什么是“动态继承”? 那是哪家公司?可能面试官不知道他在说什么,或者你误解了他在问什么。 @Mahesh:一些面试问题很少是骗人的问题。 @Mahesh:这里没有未指定或未定义的内容。它只是不存在!它可以用来衡量潜在候选人对语言的信心或权威。 【参考方案1】:

动态继承应该意味着您可以在运行时更改类层次结构。

这在动态语言中应该很简单。例如,在 javascript 中,对象将具有 prototype 属性。如果您尝试访问未为该对象定义的方法或属性,它将在原型对象中查找,依此类推。如果您更改原型,您实际上是在更改对象是什么以及可以做什么。请参阅here 和Wikipedia 以获得更合理的描述。

至于如何在 C++ 中实现这一点,可能会非常混乱。举个简单的例子:

class A

public:

    /*some fields*/

    virtual ~A()  
    virtual void f() = 0;
    virtual void g() = 0;

;

class B1 : public A
public:
    virtual void f() /*B1 implementation*/ 
    virtual void g() /*B1 implementation*/ 
;

class B2 : public A
public:
    virtual void f() /*B2 implementation*/ 
    virtual void g() /*B2 implementation*/ 
;

class C : public B1

public:
    /* ... */

;

您应该能够在运行时简单地(尽管以特定于编译器的方式)切换 C 对象中的 vptr 以在运行时指向 B2 的 v 表,并且您将拥有您的 @ 987654329@ 表现得好像它的类继承自 B2。如果我们引入对象布局和可能的自动内联,这种方法很快就会变得混乱 - 例如,如果编译器认为它知道对象的动态类型是什么并且不打扰 vtable。

要在 C++ 中正确执行此操作,我的猜测是您可能需要求助于某种表系统,可能在 Lua 中使用 metatables,然后您将丢弃所有舒适的语法方式。或者你最终会得到一种脚本语言。从某种意义上说,由于大多数动态语言解释器都是用 C 或 C++ 编写的,因此您可以争辩说它们为 C++ 添加了动态继承支持。

重点是(这就是为什么匿名投反对票的孩子对我同事的答案投反对票的原因),即使你在面试中被问到一个看似愚蠢的问题,你也应该考虑可能的解决方案。面试官可能想知道您对 C++ 和/或动态语言了解多少,或者您如何解释术语动态继承并为其提出一个可能合理的模型。

【讨论】:

【参考方案2】:

你不能也没有。没有动态继承之类的东西。

您可能指的是dynamic_cast,这是另一锅鱼。

【讨论】:

+1 反对匿名投票者的孩子。他已经参加了 2 次,删除了第一个反对票,然后再次添加。所以我就让它站着。【参考方案3】:

没有这样的东西。

这只是一串单词,以关联的方式组合在一起。

【讨论】:

以上是关于C++中的动态继承的主要内容,如果未能解决你的问题,请参考以下文章

C++多态

C++多态详解

C++多态详解

C++多态——后传

C++——多态

C++之多态总结(多态的定义及实现,抽象类,多态原理,单继承,多继承中的虚函数表)