| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 914 人关注过本帖
标题:关于继来的成员函数与基类成员函数的关系
只看楼主 加入收藏
pusawl
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2006-12-14
收藏
 问题点数:0 回复次数:9 
关于继来的成员函数与基类成员函数的关系

//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指针)都是一样的?

注意,我说的是内存模型。

[此贴子已经被作者于2007-1-2 13:54:20编辑过]

搜索更多相关主题的帖子: 函数 基类 int 成员 get 
2007-01-02 13:51
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

应该是,函数没有重载就只有一个
因调用数据不同而不同


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-01-02 14:06
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
有的话,用前缀找最佳的

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-01-02 14:06
pusawl
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2006-12-14
收藏
得分:0 
我也是这么认为的,这有利于节约内存。
发贴在此求证。
非常感谢斑竹。

2007-01-02 14:15
sbivfh
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-1-2
收藏
得分:0 

问一下大侠们。。。用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文件要如何编译啊,要分开编译吗?
谢谢!

2007-01-02 15:24
pusawl
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2006-12-14
收藏
得分:0 

致命错误:没能够打开包含的头文件point.h。
应该把point.h头文件放在和cpp1.cpp源代码文件同一个目录里。然后用#include "point.h"来包含这个头文件。
另外建议你问问题的时候重新开一个帖。


2007-01-02 15:33
sbivfh
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-1-2
收藏
得分:0 
谢谢提醒!下次一定另建新贴的。
2007-01-02 15:53
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 
回复:(pusawl)关于继来的成员函数与基类成员函数的...
继来的成员函数与基类成员函数应该不会是共享一段代码
可以想想虚继承,如果是共享就不会出现二义性了
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();
};
此外,指向成员函数的指针并非真正的指针,仅是所指对象地址与类入口地址的偏移量。当继承关系很复杂时,成员函数指针所存储的偏移量值,岂不会很混乱
当然,这也是个人看法。也盼高手指教



try new catch
2007-03-18 14:43
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
To:Arcticanimal

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


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

2007-03-18 15:45
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 
错了,要好好思考一下

try new catch
2007-03-18 20:12
快速回复:关于继来的成员函数与基类成员函数的关系
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021944 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved