在下面的In代码中,指针转换和多重继承是如何结合在一起的呢?
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);
}我的理解有点不靠谱。
一方面,someWork对Bar一无所知,因此这应该不起作用;但另一方面,我已经向前声明了Bar。
谢谢!
发布于 2010-01-31 14:05:09
这不起作用,它并不完全像你想象的那样工作。使用c风格的类型转换:
(Foo*) bar在这种情况下是错误的。您正在尝试做的是将Bar*向上转换为Foo* (即,执行从指向dervied类的指针到指向基类的指针的static_cast )。
但是,由于Bar的定义此时不可用,因此编译器不知道Foo是Bar的基类。因此,static_cast失败,编译器回退并使用reinterpret_cast,这完全不是一回事。
发布于 2010-01-31 14:00:25
嗯。我的猜测是,因为类型转换是在链接期间“计算”的,也就是在类被编译之后。但这只是一种猜测。
https://stackoverflow.com/questions/2170725
复制相似问题