0

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

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。

谢谢!

4

2 回答 2

5

这是行不通的,它并没有像你想象的那样做。您对 c 风格演员的使用​​:

(Foo*) bar

在这种情况下是不正确的。您要做的是将 a 向上Bar*转换为 a Foo*(即,static_cast从指向派生类的指针执行 a 到指向基类的指针)。

但是,由于此时 的定义Bar不可用,因此编译器不知道这Foo是 的基类Bar。因此,static_cast失败并且编译器回退并使用 a reinterpret_cast,这根本不是一回事。

于 2010-01-31T06:05:09.460 回答
0

唔。我的猜测是,由于在链接过程中对演员表进行了“评估”,这是在编译类之后。但这只是一个猜测。

于 2010-01-31T06:00:24.670 回答