【发布时间】:2015-10-10 00:04:52
【问题描述】:
我现在正在研究与多重继承相关的主题。我想出了以下代码,但无法完全弄清楚其背后的机制:
struct root
{
virtual void vfunction(){ /* root version */ }
};
struct mid1:public root
{
virtual void vfunction(){ /* mid1 version */ }
};
struct mid2:public root
{
virtual void vfunction(){ /* mid2 version */ }
};
struct inheritMulti:public mid1, public mid2
{
void ambiguityMethod(){
vfunction(); // error: ambiguous
}
void method1(){
mid1& t = *this;
t.vfunction();
}
void method2(){
mid2& t = *this;
t.vfunction();
}
};
ambiguityMethod 显然是一个错误。但是,method1 和 method2 中的函数调用让我感到困惑。它们也是虚函数调用,t 实际上是inheritMulti 类型。所以他们应该调用vfunction的inheritMulti版本,但是由于inheritMulti没有自己的版本,我不知道会发生什么。事实证明,method1 中的调用调用了mid1 版本,而method2 中的调用调用了mid2 版本。它是未定义的东西,只发生在我的编译器上吗?如果不是,为什么它会这样工作? vtable 如何处理这种情况?谢谢!
首先感谢您的帮助。我自己搜索过相关主题,所以是的,我知道“钻石问题”。但我认为我的问题与此不同。我主要关心的是method1 和method2 中“虚拟函数调用”的行为是由标准明确定义还是未定义。在编译器中,它的行为就像我上面提到的那样,但是标准所承诺的行为吗?如果定义明确,为什么分别调用mid1和'mid2'版本? (直观的想法是调用inheritMulti 版本,因为t 的类型实际上是inheritMulti)而且,大多数编译器如何处理这种情况?奇怪的是,method1 和 method2 中的虚函数调用调用了不同的函数。再次感谢!
【问题讨论】:
-
你认为这里应该发生什么?
标签: c++ polymorphism multiple-inheritance virtual-functions vtable