以下foward声明的多继承指针转换代码如何工作?

ano*_*non 0 c++ virtual-functions multiple-inheritance forward-declaration

在followint代码中,指针转换和多继承如何一起发挥作用?

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);
}
Run Code Online (Sandbox Code Playgroud)

我的理解有点不稳定.

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

谢谢!

Jam*_*lis 5

这不起作用,它没有做你想象的那么多.你使用c风格的演员表:

(Foo*) bar
Run Code Online (Sandbox Code Playgroud)

在这种情况下是不正确的.你要做的是向上转换Bar*为a Foo*(即,static_cast从指向某个类的指针执行指向基类的指针).

Bar但是,由于此时定义不可用,因此编译器不知道它Foo是基类Bar.因此,static_cast失败和编译器回退并使用a reinterpret_cast,这根本不是同一个东西.