邪恶的向前申明(forward declaration) 还是邪恶的隐式类型转换
前几天遇到一个诡异的问题。
base.h
class Base1 {
public:
virtual void do_something();
};
class Base2 {
public:
virtual void do_something2();
};
class Impl:public Base1, public Base2 {
public:
virtual void do_something2();
};
public:
virtual void do_something();
};
class Base2 {
public:
virtual void do_something2();
};
class Impl:public Base1, public Base2 {
public:
virtual void do_something2();
};
void foo(Base1 &base1){
base1.do_something();
在test.h中
class Impl;
void bar(Impl &impl);
在test.cc中
void bar( &impl){
foo((Base&)impl);
}
foo((Base&)impl);
}
注意,这里在test.cc中,我没有include base.h! 所以,我需要强制转换,否则编译不过!我傻了,正常情况下显然不需要强制转换的,到这一步我就应该意识到出问题了。但是,我继续了,于是悲剧了...
运行时,我以为base1的do_something()会被调用,结果调用了Base1里另外一个莫名其妙的函数.为什么会这样?相信这和编译的内存模型相关。具体我暂时也说不清。
问题是,这里我本有两种方法避免这个bug:
1. 不用前向申明。 没有这东西,我就必须include "base.h".那就一切正常。前向申明的存在是为了减少编译以来从而缩短编译时间。 到底要不要,自己权衡吧。
2. 在任何涉及到类型转换的时候,显示的做它,而且使用c++中的*_cast()函数 。如果我在代码里使用了foo(dynamic_cast<Base1*>(impl)), 没有include的话就会编译报错,说类型不完全。这样多安全。
不过,这里调用了莫名函数的问题很奇怪,需要研究一下...
posted on 2011-06-01 12:00 freestyleking 阅读(299) 评论(0) 编辑 收藏 举报