C++中的动态继承

2 c++ inheritance

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

Vla*_*lad 10

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

这在动态语言中应该非常简单.例如,在Javascript中,对象将具有prototype属性.如果您尝试访问未为该对象定义的方法或属性,则将在原型对象中查找它,依此类推.如果您更改原型,则可以有效地更改对象和可以执行的操作.请参阅此处维基百科,以获得更完整的描述.

至于如何在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:
    /* ... */

};
Run Code Online (Sandbox Code Playgroud)

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

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

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


Pup*_*ppy 9

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

你可以指的是dynamic_cast,这是另一个鱼的水壶.


Che*_*Alf 8

哪有这回事

它只是一串单词,以联想的方式组合在一起

干杯和hth.,