注册 登录
编程论坛 C++教室

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

pusawl 发布于 2007-01-02 13:51, 914 次点击

//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编辑过]

9 回复
#2
song42007-01-02 14:06

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

#3
song42007-01-02 14:06
有的话,用前缀找最佳的
#4
pusawl2007-01-02 14:15
我也是这么认为的,这有利于节约内存。
发贴在此求证。
非常感谢斑竹。
#5
sbivfh2007-01-02 15:24

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

#6
pusawl2007-01-02 15:33

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

#7
sbivfh2007-01-02 15:53
谢谢提醒!下次一定另建新贴的。
#8
Arcticanimal2007-03-18 14:43
回复:(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();
};
此外,指向成员函数的指针并非真正的指针,仅是所指对象地址与类入口地址的偏移量。当继承关系很复杂时,成员函数指针所存储的偏移量值,岂不会很混乱
当然,这也是个人看法。也盼高手指教


#9
litcatyx2007-03-18 15:45
To:Arcticanimal

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


还有指向成员变量的指针是偏移量,而指向成员函数的指针是真正的指针。
#10
Arcticanimal2007-03-18 20:12
错了,要好好思考一下
1