在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++的设计人员也是基于这样的考虑才没有提供这样的特性支持的吧。
即
... // 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++的设计人员也是基于这样的考虑才没有提供这样的特性支持的吧。