找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 608|回复: 9

关于继来的成员函数与基类成员函数的关系

[复制链接]
发表于 2009-11-5 00:25:58 | 显示全部楼层 |阅读模式 IP:江苏扬州
//point.h
#include <iostream.h>
#ifndef POINT
#define POINT
class point
{
int x,y;
public:
void set_xy(int a,int b)
{
x=a;
y=b;
}
int get_x()
{
cout<<x<<endl;
return x;
}
int get_y()
{
cout<<y<<endl;
return y;
}
};
#endif

//circle.h
#include <iostream.h>
#ifndef CIRCLE
#define CIRCLE
class circle:public point
{
int radius;
public:
void set_radius(int r)
{
radius=r;
}
int get_radius()
{
cout<<radius<<endl;
return radius;
}
};
#endif

//main
#include <iostream.h>
#include "point.h"
#include "circle.h"
int main()
{
point pt;
pt.set_xy(1,2);
pt.get_x();
pt.get_y();
circle cl;
cl.set_xy(3,4);
cl.set_radius(100);
cl.get_x();
cl.get_y();
cl.get_radius();
return 0;
}

请问,派生类对象cl中继承于基类的set_xy()函数与基类对象pt中的set_xy()函数在内存模型中是否只有一个拷贝?换句话说派生类对象继承于基类的成员函数和基类对象中的对应成员函数在整个程序中共享一段代码?再换句话说不论派生类对象还是基类对象指向这些函数的指针(不是说this指针)都是一样的?

注意,我说的是内存模型。
发表于 2009-11-5 00:26:00 | 显示全部楼层 IP:江苏扬州
应该是,函数没有重载就只有一个
因调用数据不同而不同
回复

使用道具 举报

发表于 2009-11-5 00:26:01 | 显示全部楼层 IP:江苏扬州
有的话,用前缀找最佳的
回复

使用道具 举报

发表于 2009-11-5 00:26:02 | 显示全部楼层 IP:江苏扬州
我也是这么认为的,这有利于节约内存。
发贴在此求证。
非常感谢斑竹。
回复

使用道具 举报

发表于 2009-11-5 00:26:04 | 显示全部楼层 IP:江苏扬州
问一下大侠们。。。用vc++ 6.0编译上面的程序为什么出现这个呢?
--------------------Configuration: Cpp1 - Win32 Debug--------------------
Compiling...
Cpp1.cpp
c:\documents and settings\administrator\my documents\microsoft visual v++ 6.0\cpp1.cpp(48) : fatal error C1083: Cannot open include file: 'point.h': No such file or directory
Error executing cl.exe.
Cpp1.exe - 1 error(s), 0 warning(s)


我是直接把他们拷贝再运行的,是不是我方法不对啊,象这个包含*.h,*.cpp文件要如何编译啊,要分开编译吗?
谢谢!
回复

使用道具 举报

 楼主| 发表于 2009-11-5 00:26:05 | 显示全部楼层 IP:江苏扬州
致命错误:没能够打开包含的头文件point.h。
应该把point.h头文件放在和cpp1.cpp源代码文件同一个目录里。然后用#include "point.h"来包含这个头文件。
另外建议你问问题的时候重新开一个帖。
回复

使用道具 举报

发表于 2009-11-5 00:26:06 | 显示全部楼层 IP:江苏扬州
谢谢提醒!下次一定另建新贴的。
回复

使用道具 举报

发表于 2009-11-5 00:26:09 | 显示全部楼层 IP:江苏扬州
继来的成员函数与基类成员函数应该不会是共享一段代码
可以想想虚继承,如果是共享就不会出现二义性了
class BASE { public: int func();
//......
};

class A :public base
{ public: int fun_of_A();
//...
};

class B: public base
{ public: int fun_of_B();
//...
};

class AB: virtual A,virtual B //如果是共享代码,AB中就不会出现两份 BASE::int func();的拷贝
// 也就用不到虚继承了
{ public: int func_of_AB();
};
此外,指向成员函数的指针并非真正的指针,仅是所指对象地址与类入口地址的偏移量。当继承关系很复杂时,成员函数指针所存储的偏移量值,岂不会很混乱
当然,这也是个人看法。也盼高手指教
回复

使用道具 举报

发表于 2009-11-5 00:26:10 | 显示全部楼层 IP:江苏扬州
To:Arcticanimal

从基类继承来的成员函数的代码只有一份。但是按你说的继承层次,如果不用虚拟继承还是会产生二义性,因为调用成员函数的时候隐含传递一个this指针,编译器会调整this指针的值,使其指向正确的对象,在你的代码里,如果通过AB类的对象调用func()的话,编译器不知道this应该指向A中的BASE子对象还是B中的BASE子对象,所以会产生二义性


还有指向成员变量的指针是偏移量,而指向成员函数的指针是真正的指针。
回复

使用道具 举报

发表于 2009-11-5 00:26:11 | 显示全部楼层 IP:江苏扬州
错了,要好好思考一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-10-1 07:30 , Processed in 0.203624 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表