C++中定义派生类之前需要看到基类的定义实体

来源:互联网 发布:淘宝买家投诉三无产品 编辑:程序博客网 时间:2024/06/06 01:44
 在C++中定义一个从基类base派生出来的类derv,需要在定义base之前确保编译器能够看到base的定义实体,



...    // base的类定义要出现在此处
class B: public base {
...
};


如果仅仅是在定义derv之前声明一下base,如下所示:

class base;
class derv : public base {
};


编译器会报出如下的错误信息
derv.h:2: error: invalid use of incomplete type ‘struct base’
derv.h:1: error: forward declaration of ‘struct base’

为什么c++语言要加上这个限制呢?

我思考了一下,觉得可以用这个理由来解释:在程序中使用派生类的时候,比如,创建一个派生类对象,访问一个

派生类对象的方法,都会需要访问基类的内容。因为派生类就是在基类的基础上扩展形成的一个类。在内存布局

中,可以看到派生类实际上就是在基类上追加了一些字段。

设想一下,有如下的类定义:
base.h:
class base {
   public:
        virtual int v_foo() { return 10;}
}


derv.h:
class derv : public base{
   public:
        int foo() { return 201; }
};


main.cc:
#include "derv.h"
int main()
{
     derv * p = new derv;
}



在new语句中试图分配一个derv对象的时候,需要看到基类base的定义信息,然后才能在base的基础上添加

derv中定义的内容,构成一个新的对象。

理论上说,c++编译器可以作得足够聪明,对程序中用到derv的地方(创建derv对象,调用derv方法,访问derv

的数据成员)插一个桩,并不为其生成实际的code,等到将所有c++源文件编译完以后,再用获得的base类的信

息进行解桩,以解决上面的问题,但这会给编译器的设计人员带来额外的负担,而且会影响编译器的执行效率。我

想c++的设计人员也是基于这样的考虑才没有提供这样的特性支持的吧。

原创粉丝点击