C ++中的动态继承

时间:2011-11-05 18:17:43

标签: c++ inheritance

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

3 个答案:

答案 0 :(得分:10)

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

这在动态语言中应该非常简单。例如,在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:
    /* ... */

};

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

要在C ++中正确地做到这一点,我猜你可能需要求助于某种表系统,也许在Lua中使用metatables,然后你就会抛弃所有方便的语法。或者你最终得到了一种脚本语言。从某种意义上说,由于大多数动态语言解释器都是用C或C ++编写的,你可以说它们为C ++添加了动态继承支持。

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

答案 1 :(得分:9)

你不能也没有。没有动态继承这​​样的东西。

你可能指的是dynamic_cast,这是另外一条鱼。

答案 2 :(得分:7)

没有这样的东西

它只是一串单词,以关联方式放在一起

欢呼&第h。,