2012-09-07 54 views
6
  1. 虚拟继承使用vTable吗?如果是或否,那么它是如何实现的
  2. 虚拟继承如何在内存中运行?
  3. 任何其它替代为虚拟继承

非常感谢的概念的说明。虚拟继承如何工作?

+0

定义的实现。 – ildjarn

+0

它是依赖于实现的,在严格的技术术语中它是* Unspecified *,C++标准只描述了虚拟继承必须提供的行为,但没有指定它应该如何实现。它作为实现&他们不需要指定这个细节。他说,大多数(* read all known *)的编译器都使用虚拟表和指针机制。 –

+1

说了上面的内容,不要认为Q是无关紧要的,或者根本不是真正的Q.所有编译器都使用类似的机制,虽然不需要知道实现细节,但知道它并不会让人伤心。另外,如果有人抽出时间并且有说服力地回答,这个问题会被问到很多次,这会使得一个很好的C++ - faq。 –

回答

1

取决于编译器,虚拟继承以不同的方式实现。

1)是的,vc和gcc都使用vTable指针。但是vc有另一个指针ref作为虚拟基址指针。

2)对于经典的虚拟继承,如Left < Top;右边<顶部;底部<左,右 堆栈应该是这样的:

Left.vptr // -> to its vtable 

Left::element_in_left 

Right.vptr 

Right::element_in_right 

Bottom::element_in_bottom 

Top::element_in_top 

程序使用的vptr找到虚函数表,对海湾合作委员会,有一个虚拟的基地,在可行的偏移值。 vptr + base offset将会给出父地址。

3)我不确定你是什么意思。有不同的方式在C++编译器中实现它。其他语言有他们的方法来绑定函数。

+0

非常感谢!它似乎退出复杂!你能推荐我一些简单的文章或书籍阅读有关这个​​。 –

+0

@NayanaAdassuriya我已经阅读了我的母语文章中的这些知识,所以我不熟悉英文书籍。我想你可以在谷歌搜索“C++内存布局虚拟继承”,有很多很棒的帖子。 – halfelf