在采访中我遇到了关于动态继承的问题,但我从未在C ++中使用过动态继承。 我想知道如何在C ++中实现动态继承,以及在C ++语言中动态继承的实际用途是什么?
答案 0 :(得分:10)
动态继承应该意味着您可以在运行时更改类层次结构。
这在动态语言中应该非常简单。例如,在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:
/* ... */
};
您应该能够简单地(尽管以特定于编译器的方式)在vptr
对象中切换C
以在运行时指向B2
的v表,并且您的C
行为就好像它的类继承自B2
一样。如果我们引入对象布局,并且可能自动内联 - 例如,如果编译器认为它知道对象的动态类型是什么并且不打扰vtable,那么这种方法会很快变得混乱。
要在C ++中正确地做到这一点,我猜你可能需要求助于某种表系统,也许在Lua中使用metatables,然后你就会抛弃所有方便的语法。或者你最终得到了一种脚本语言。从某种意义上说,由于大多数动态语言解释器都是用C或C ++编写的,你可以说它们为C ++添加了动态继承支持。
点是(这就是为什么这位匿名的downvoter孩子低估了同事的答案),即使你在面试中被问到一个看似愚蠢的问题,你也应该考虑可能的解决方案。面试官可能想知道你对C ++和/或动态语言的了解程度,或者你如何解释动态继承这个术语,并为它提出一个可能合理的模型。
答案 1 :(得分:9)
你不能也没有。没有动态继承这样的东西。
你可能指的是dynamic_cast
,这是另外一条鱼。
答案 2 :(得分:7)
没有这样的东西
它只是一串单词,以关联方式放在一起
欢呼&第h。,