社区
C++ 语言
帖子详情
在线等待--静态成员函数的使用和继承问题
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
打赏
收藏
在线等待--静态成员函数的使用和继承问题
描述 class base { public: static int statFun(); ...... } class derived1:public base{ ...... } class derived2:public base{ static int statFun(); ...... } 请问: 1. derived1怎么使用statFun()? 2. derived2怎么使用statFun()?
复制链接
扫一扫
分享
转发到动态
举报
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)
C/C++语言基础--C++类数据、静态与非静态、常成员、友员、成员变量与
函数
指针等相关知识点
因为
静态成员
变量不属于对象,他在全局区,在类或者结构体中只是声明 ,后面必须要定义。
unity的C#学习——类的成员
函数
与
继承
、接口的定义与实现
本文介绍了C#的类的概念,以及类的定义和
继承
,以及类的方法的定义、不同类型的方法(成员
函数
)间区别:构造
函数
、析构
函数
、静态
函数
。 此外还详细说明了如何
使用
派生类
继承
抽象类与实现接口,以及这二者间的区别。
Linux---fork
函数
和exec
函数
这里主要介绍Unix/Linux中进程创建,fork()
函数
和exec()
函数
。
【C/C++学院】0822-类型转换
函数
与构造转换
函数
/类的
继承
/类的
继承
以及区别/
继承
静态成员
与静态
函数
//
继承
实现代码重用/单
继承
QT案例/多
继承
简介以及实战/Gpu编程
类型转换
函数
与构造转换
函数
#include class fushu { public: explicit fushu(int num)//避免隐式转换,引发歧义 { x = num; y = num; } void print() { std::cout << x << "+" << y << "i" << std::endl; } operator int()
c#---构造
函数
目录 构造
函数
语法
使用
构造
函数
实例构造
函数
无参数构造
函数
私有构造
函数
示例 静态构造
函数
备注 用法 示例 每当创建类或结构时,将会调用其构造
函数
。 类或结构可能具有采用不同参数的多个构造
函数
。
使用
构造
函数
,程序员能够设置默认值、限制实例化,并编写灵活易读的代码。 构造
函数
语法 构造
函数
是一种方法,其名称与其类型的名称相同。 其方法签名仅包含方法名称和其参数列表;它不包含返回类型。 以下示例演示一个名为Person的类的构造
函数
。 ...
C++ 语言
65,193
社区成员
250,524
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章