0

在followint代码中,指针转换&多重继承如何一起玩?以下foward声明的多继承指针转换代码如何工作?

class Foo { 
    public: 
    virtual void someFunc(); 
}; 

class Bar; 


void someWork(Bar *bar) { 
    ((Foo*) bar)->someFunc(); 
} 

class Bar: public Zed, public Foo { 
... 
virtual void someFunc() { ... do something else ... } 
} 

Bar bar; 

int main() { 
    someWork(&bar); 
} 

我的理解有点不稳定。

一方面,有些工作对酒吧一无所知,所以这不应该工作;但另一方面,我已经向前宣布了Bar。

谢谢!

+1

对另一个问题的这个答案有一个很好的列表,你可以做什么,不能做一个不完整的类型:http://stackoverflow.com/questions/553682/when-to-use-forward-declaration/553869#553869 – 2010-01-31 06:13:23

回答

5

这不起作用,它没有做到你认为的那样。您使用C风格演员:

(Foo*) bar 

在这种情况下不正确。你试图做的是将Bar*上传到Foo*(即,从指向dervied类的指针到指向基类的指针执行static_cast)。

由于Bar的定义目前尚不可用,编译器不知道FooBar的基类。因此,static_cast失败,编译器退回并使用reinterpret_cast,这不完全相同。

+0

我无法让你满意。 – anon 2010-01-31 06:25:33

0

嗯。我的猜测是,因为演员在链接过程中被“评估”,这是在课程编辑完成之后。但这只是一个猜测。