首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下面的前向声明的多继承指针转换代码是如何工作的?

下面的前向声明的多继承指针转换代码是如何工作的?
EN

Stack Overflow用户
提问于 2010-01-31 13:53:28
回答 2查看 76关注 0票数 0

在下面的In代码中,指针转换和多重继承是如何结合在一起的呢?

代码语言:javascript
复制
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。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-31 14:05:09

这不起作用,它并不完全像你想象的那样工作。使用c风格的类型转换:

代码语言:javascript
复制
(Foo*) bar

在这种情况下是错误的。您正在尝试做的是将Bar*向上转换为Foo* (即,执行从指向dervied类的指针到指向基类的指针的static_cast )。

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

票数 5
EN

Stack Overflow用户

发布于 2010-01-31 14:00:25

嗯。我的猜测是,因为类型转换是在链接期间“计算”的,也就是在类被编译之后。但这只是一种猜测。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2170725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档