邪恶的向前申明(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();
};
 

void foo(Base1 &base1){

    base1.do_something();

 

 在test.h中

class Impl;

void bar(Impl &impl);

 在test.cc中

void bar( &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编辑  收藏  举报

导航