在线等待--静态成员函数的使用和继承问题

lingyb 2006-04-14 10:57:03
描述

class base {
public:
static int statFun();
......
}
class derived1:public base{
......
}
class derived2:public base{
static int statFun();
......
}

请问:
1. derived1怎么使用statFun()?
2. derived2怎么使用statFun()?
...全文
1117 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ariesheen 2006-04-16
  • 打赏
  • 举报
回复
我记得静态成员是可以用.或者::来调用的
格式不一样
. 是对象名.静态成员
:: 是类名::静态成员

->不能使用,因为静态成员是被存放在单独的内存中的
类内非静态成员都隐含有this指针
byzero 2006-04-16
  • 打赏
  • 举报
回复
用范围标识符“::”来表明调用的是哪个类的函数
静态成员函数不应该使用"->"或"."来调用
yuanchuang 2006-04-15
  • 打赏
  • 举报
回复
混分
tianyanzjq 2006-04-15
  • 打赏
  • 举报
回复
我记得静态成员函数是可以被继承的,但不能是虚的,所以derived1调用的是父类的,而在derived2中对该函数进行了重写,这里面存在覆盖的问题,thinking in c++中有介绍的,所以调用的是自己类中的
beginnow 2006-04-14
  • 打赏
  • 举报
回复
虽然可以用::来消除歧义,但是用类对象呢?

1. derived1怎么使用statFun()?
derived1 继承自base ,他也有statFun(),
2. derived2怎么使用statFun()?
使用哪个statFun,是自己的还是base,在derived2中如果使用base的statFun,base::statFun.在外部使用的应该是derived2自己的statFun
fiftymetre 2006-04-14
  • 打赏
  • 举报
回复
萧萧雨 说的不错嘛。


明确的用::来消除歧义
Johnny_de 2006-04-14
  • 打赏
  • 举报
回复
如果对于非静态的方法statFun,肯定是覆盖的。
但是对于静态方法,我觉得确实不存在覆盖问题,因为静态方法在编译时保存在内存的静态数据区,每个类拥有各自的静态函数,所以不是同一函数。
Johnny_de 2006-04-14
  • 打赏
  • 举报
回复
static int statFun();
是个全局范围内的函数。可以为该类及继承的类的对象共享。

derived2 objectOfDerved2;
objectOfDerved2.statFun();
这时会有编译错误,会提示不能访问derived2类的私有函数,所以,如果想访问全局的statFun,应该用base::statFun.

derived1 objectOfDerved1;
objectOfDerved1.statFun();
这样是可以的,调用的是全局的函数statFun。
langzi8818 2006-04-14
  • 打赏
  • 举报
回复
xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨) ( ) 信誉:97 2006-04-14 11:29:00 得分: 0


由于static成员函数的调用不存在this指针的问题, 所以不存在重载(overload)与覆盖(override)的问题, 对于可以区分的情况下, 会直接调用, 如果子类存在与基类相同的函数, 则基类对象调用的则是基类的静态函数, 子类调用的是子类静态函数. 子类亦可调用基类静态函数, 但需要用base::指定类作用域.

实质上对于静态函数, 想使用base类的静态函数则使用base::statFun()调用
对于子类使用derived::statFun(), 不需要用对象方式来调用.


不明白为什么不存在覆盖的问题。你下面说了啊,如果子类存在与基类相同的函数, 则基类对象调用的则是基类的静态函数, 子类调用的是子类静态函数.这个不是覆盖了吗?
limaolinghu 2006-04-14
  • 打赏
  • 举报
回复
没看到 public
那么应该是
objectOfDerved1.statFun();
父类

objectOfDerved2.statFun()
子类
xiaocai0001 2006-04-14
  • 打赏
  • 举报
回复
由于static成员函数的调用不存在this指针的问题, 所以不存在重载(overload)与覆盖(override)的问题, 对于可以区分的情况下, 会直接调用, 如果子类存在与基类相同的函数, 则基类对象调用的则是基类的静态函数, 子类调用的是子类静态函数. 子类亦可调用基类静态函数, 但需要用base::指定类作用域.

实质上对于静态函数, 想使用base类的静态函数则使用base::statFun()调用
对于子类使用derived::statFun(), 不需要用对象方式来调用.
limaolinghu 2006-04-14
  • 打赏
  • 举报
回复
objectOfDerved1.statFun();
应该编译error吧。

objectOfDerved2.statFun()
应该是调用子类的吧。
lingyb 2006-04-14
  • 打赏
  • 举报
回复
如果这样呢:
derived2 objectOfDerved2;

objectOfDerved2.statFun();或者
derived1 objectOfDerved1;

objectOfDerved1.statFun();
会产生什么结果?
healer_kx 2006-04-14
  • 打赏
  • 举报
回复
base::statFun();
逸学堂 2006-04-14
  • 打赏
  • 举报
回复
类对象的内存布局,只包括数据项,不包括函数(成员函数,static函数,友元函数)。
lingyb 2006-04-14
  • 打赏
  • 举报
回复
有一点忘记补充了:这里的所有statFun()都是public的.

现在我来归纳一下,答案是否是这样的:
1. derived1对象的内存布局中并没有statFun元素,但derived1::statFun() 等价于 base::statFun()

2. derived2对象内存布局中也没有statFun元素,但derived2::statFun() 不同于 base::statFun()

不知这样的答案是否是正确的?请各位高手指点,谢谢!
langzi8818 2006-04-14
  • 打赏
  • 举报
回复
好!终于没有问题了
逸学堂 2006-04-14
  • 打赏
  • 举报
回复
所以类的对象是不能访问成员函数的。
~~~~~~
说错了。所以类的对象是不能访问非成员函数的。
lingyb 2006-04-14
  • 打赏
  • 举报
回复
有一点忘记补充了:这里的所有statFun()都是public的.
逸学堂 2006-04-14
  • 打赏
  • 举报
回复
class base {
public:
static int statFun();
......
}
class derived1:public base{
......
}
class derived2:public base{
static int statFun();
......
}

请问:
1. derived1怎么使用statFun()?
~~~~~~~~~~~~~~~~
一种解决方案就是
在子类中定义一个接口,而这个接口的实现调用父类的静态函数
class derived1:public base{
int fun()
{
return(base::statFun)
}
}

这样的话
derived1 d;
d.fun(); // 其内部调用父类的static statFun函数。

至于derived2,可以直接是使用fun()函数。
derived2 d2;
d2.fun();

说道底,static不属于类的成员函数,所以类的对象是不能访问成员函数的。
只能通过class::限定来使用static函数。
加载更多回复(2)

65,193

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧