在采访中我遇到了关于动态继承的问题,但我从未在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)
您应该能够简单地(尽管以特定于编译器的方式)vptr在C对象中切换对象以指向B2运行时的v表,并且您的C行为就好像它的类继承而来B2.如果我们引入对象布局,并且可能自动内联 - 例如,如果编译器认为它知道对象的动态类型是什么并且不打扰vtable,那么这种方法可能会很快变得混乱.
要在C++中正确地做到这一点,我猜你可能需要求助于某种表系统,也许使用像Lua中的元表,然后你就会抛弃所有舒适语法的方式.或者你最终得到了一种脚本语言.从某种意义上说,由于大多数动态语言解释器都是用C或C++编写的,你可以说它们为C++添加了动态继承支持.
点是(这就是为什么匿名的downvoter孩子低估了同事们的答案),即使你在面试中被问到一个看似愚蠢的问题,你也应该考虑可能的解决方案.面试官可能想知道你对C++和/或动态语言的了解程度,或者你如何解释动态继承这个术语,并为它提出一个可能合理的模型.
| 归档时间: |
|
| 查看次数: |
6265 次 |
| 最近记录: |