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++的设计人员也是基于这样的考虑才没有提供这样的特性支持的吧。
即
... // 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++的设计人员也是基于这样的考虑才没有提供这样的特性支持的吧。
- C++中定义派生类之前需要看到基类的定义实体
- 继承与派生4:派生类中对基类成员的重定义
- 定义派生类
- 定义派生类
- C++中类的定义和派生要领
- !!!!!!!!!!!!!!!!C++:派生类中重定义基类的成员函数与虚函数区别在哪里?
- C++中使用基类指针调用派生类中定义的方法
- C++ 中类在定义之前声明
- 继承与派生2:派生类的定义
- C++派生类中定义基类的虚函数时需注意的事项
- 15.2基类与派生类的定义
- C++ 定义基类和派生类
- 定义基类和派生类
- NHibernate中定义实体类属性的方法
- 避免在派生类中重新定义基类的非虚函数
- windows库中,定义了类,头文件可以看到,相应的方法能不能看到阿
- hibernate 中 实体类 使用int定义变量 和 使用Integer定义变量的区别
- 三、定义主从实体基类
- Visitor模式浅谈(1)
- CSS技巧心得
- C++中平台无关整数类型的表示
- Java编程那些事儿26—移位运算符
- 一道C++模板题
- C++中定义派生类之前需要看到基类的定义实体
- ERP系统成功选型的三个技巧
- 突然想起这个网站的PR值有肯能是10哦!
- Discuz! 7.0 模块脚本文件名
- 制作主页的五十个秘诀
- fwrite和ofstream文件输出效率上哪个更快?
- 有关软件模块化设计的思考
- 软件设计随感
- 用c#实现winform的动画效果