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

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

【问题讨论】:

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

标签: c++ inheritance


【解决方案1】:

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

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

至于如何在 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】:

    没有这样的东西。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      相关资源
      最近更新 更多