gpt4 book ai didi

c++ - C++中的动态继承

转载 作者:太空狗 更新时间:2023-10-29 23:21:27 24 4
gpt4 key购买 nike

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

最佳答案

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

这在动态语言中应该非常简单。例如,在 Javascript 中,对象将具有 prototype 属性。如果您尝试访问未为该对象定义的方法或属性,则会在原型(prototype)对象中查找,依此类推。如果您更改原型(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 切换为指向 的 v 表B2 在运行时,你会让你的 C 表现得好像它的类继承自 B2。如果我们引入对象布局和可能的自动内联,这种方法很快就会变得困惑 - 比如说,如果编译器认为它知道对象的动态类型是什么并且不理会 vtable。

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

要点是(这就是为什么匿名投票者否决我同事的答案的原因),即使您在面试中被问到一个看似愚蠢的问题,您也应该考虑可能的解决方案。面试官可能想知道您对 C++ 和/或动态语言了解多少,或者您如何解释动态继承一词并为其提出一个可能合理的模型。

关于c++ - C++中的动态继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8022254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com