啊,又发现一个问题,想向大家请教一番了

千梦一生 2020-04-15 05:16:52
我刚刚在学习:为什么虚函数不允许static
大约可能有点点听懂了。说动态连接、this指针什么的,我一看就觉得。总之、和对象有关系就是了。

因此延申一想:既然是对象的原因,导致不允许实现static virtual

那么?类呢?
虚 类函数呢?
但是好像没有类虚函数啊?!
为什么没有呢?

虚函数目的是强制继承者实现。而且,这样也应该不存在上述那样的冲突了才是呀。

但为什么,似乎没有虚 类函数这个东西呢?

谢谢大家了
...全文
178 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2020-04-16
  • 打赏
  • 举报
回复
引用 8 楼 千梦一生 的回复:
两位老师说的是的。
我那样的话,确实不能实现多态这个东西的。
但目前我有一个构想:
两个类Point、和 Line 分别继承于Griphic
形式如下
class Point:Griphic
{
static string getClassType(){return "点"};
}
class Line:Griphic
{
static string getClassType(){return "线段"};
}
显然还可能有更多的子类。
我都需要他们能返回各自的是什么类型。
我就有个想法:可否类似虚函数一样,来限制他们都实现一个类方法 static XXXX::getClassType();

就像,我是领导者,我说这个东西我我认为有用,所有小弟都应该给我实现一个这个东西出来。你们自己用(不通过我“多态”,当然也没法儿)。

那你这个构思就更不应该用静态方法,因为你都已经知道类名了,如果你不知道类名怎么调用Griphic::getClassType,即知道类名了,返回不返回string有什么意义?
而非静态方法则恰恰相反用虚函数更有意义

void dosomething(A *a) {
a->getClassType(); //这个是A的虚函数
}
dosomething(new B());
dosomething(new C());

这样的话,使用dosomething函数的用户不知道参数a具体是什么类型,但是通过调用a->getClassType();就知道具体类型。
而如果用静态方法,都已经知道是什么类了(因为不知道类就没法用类型::静态方法调用),那我还特意用个虚函数来获取类型有什么意思?

千梦一生 2020-04-16
  • 打赏
  • 举报
回复
引用 6 楼 qybao 的回复:

引用 5 楼 真相重于对错 的回复:

两位老师说的是的。
我那样的话,确实不能实现多态这个东西的。
但目前我有一个构想:
两个类Point、和 Line 分别继承于Griphic
形式如下
class Point:Griphic
{
static string getClassType(){return "点"};
}
class Line:Griphic
{
static string getClassType(){return "线段"};
}
显然还可能有更多的子类。
我都需要他们能返回各自的是什么类型。
我就有个想法:可否类似虚函数一样,来限制他们都实现一个类方法 static XXXX::getClassType();

就像,我是领导者,我说这个东西我我认为有用,所有小弟都应该给我实现一个这个东西出来。你们自己用(不通过我“多态”,当然也没法儿)。
月凉西厢 2020-04-16
  • 打赏
  • 举报
回复
你可以尝试想象一下静态虚函数的内存模型。。。
qybao 2020-04-16
  • 打赏
  • 举报
回复
引用 4 楼 千梦一生 的回复:
[quote=引用 3 楼 qybao 的回复:]
首先你要知道虚函数的意义是什么?
虚函数是为了多态,每个子类对象可以有不同的实现。
如果改成静态方法,则该函数不以对象而改变,调用同一个类的静态方法都是一样的,那还为啥要虚函数呢?


这位老师,早上好。虚函数可能大约理解了些。
但只是我有这么一个设想。

class A
{
virtual static int func();
}
class B:A
{
virtual static int func(){return 0};//实现该方法,返回0。
}
class C:A
{
virtual static int func(){return 1};//实现该方法。
}

//然后,可以分别进行调用
B::func();
C::func();

我觉得这么做的话,看上去是能行的呀
类函数虚拟化,实现多态,要求任何继承的类必须实现该类函数[/quote]我觉得你应该理解一下多态的用法 比如某个函数 void dosomething(A *a) { a->func(); //这个func是A的虚函数 } 调用函数的时候 dosomething(new B()); dosomething(new C()); 传不同的参数达到不同的效果 如果你用类方法 void dosomething(A *a) { A::func(); //这个func是静态虚函数 } 那么不管你传入什么参数,效果都一样,还有什么意义吗?
真相重于对错 2020-04-16
  • 打赏
  • 举报
回复
你的理解是错误的。 从逻辑上说,静态方法属于整个类型。那么子类和父类是不是一个类型呢? 比如定义了一个动物类,人类继承动物类,你不能说人不是动物。既然人是动物,那么动物的静态方法比如吃饭也属于人类。 从技术上来说: 一般多态是这样的 struct A{ virtual void fun(); } struct B:A{ void fun(){}; } void fun(A& a1) { a1.fun(); } B b1; fun(b1); 如果fun是静态函数,那么你要A::fun()或者B::fun() ,其实这已经不能做到动态调用了,而是编译器实际绑定。无法起到动态绑定的效果。 因此static 不能是虚拟的。
千梦一生 2020-04-16
  • 打赏
  • 举报
回复
引用 3 楼 qybao 的回复:
首先你要知道虚函数的意义是什么?
虚函数是为了多态,每个子类对象可以有不同的实现。
如果改成静态方法,则该函数不以对象而改变,调用同一个类的静态方法都是一样的,那还为啥要虚函数呢?


这位老师,早上好。虚函数可能大约理解了些。
但只是我有这么一个设想。

class A
{
virtual static int func();
}
class B:A
{
virtual static int func(){return 0};//实现该方法,返回0。
}
class C:A
{
virtual static int func(){return 1};//实现该方法。
}

//然后,可以分别进行调用
B::func();
C::func();

我觉得这么做的话,看上去是能行的呀
类函数虚拟化,实现多态,要求任何继承的类必须实现该类函数
_mervyn 2020-04-16
  • 打赏
  • 举报
回复
引用 2 楼 千梦一生 的回复:
我就在想。既然有类函数,为什么没有 虚类函数 呢? 将func定义为 虚类函数 ,要求派生类必须实现该 类函数。直观上看上去,似乎在逻辑上没什么问题才是啊? 可是我并没学到过这种。为什么没有这样的函数呢?
。。。为什么要有这样的函数呢? 你所说的类函数,也就是静态成员函数 其实和全局函数没多少区别,你可以直接简单理解成带命名空间的全局函数就可以了。 那你想不想问:为什么没有“虚 全局函数”? 。。。 一个用户在需要使用一个静态成员函数或者全局函数前,首先就得已经知道有这个函数了,有这个函数声明了,且明确知道这个函数是个什么样的功能实现了。 而虚函数的魅力在于:一个用户在明确某个类有某种功能,且拿到了某个该类的实例,在不知道这个实例具体是啥的情况下,就直接可以调用这个实例对于该功能的实现。 我觉得你对于虚函数最大的误区在于:
引用 2 楼 千梦一生 的回复:
要求派生类必须实现该 类函数。
虚函数并不要求派生类必须实现! 要求派生类必须实现的,那叫 纯虚函数! 我觉得你想要的东西,简单来讲,就是想要在某个命名空间内 必须得有一个xxx名字的函数。这样的需求实际应用场景在哪里? A:: 底下没有xxx这个函数,你就自己写一个啊。然后调用它就完事了。 你既然知道A,那就肯定知道A应该如何实现xxx。
qybao 2020-04-15
  • 打赏
  • 举报
回复
首先你要知道虚函数的意义是什么? 虚函数是为了多态,每个子类对象可以有不同的实现。 如果改成静态方法,则该函数不以对象而改变,调用同一个类的静态方法都是一样的,那还为啥要虚函数呢?
千梦一生 2020-04-15
  • 打赏
  • 举报
回复
引用 1 楼 suifengsanjin 的回复:
虛函數是實現多態的一種重要手段
在繼承的時候子類可以有不同的實現,在編譯的時候是通過虛函數表來指向具體實現的,是動態的,在運行時指定
而static要求靜態,在編譯的時候就指定,兩個是相互衝突的
https://blog.csdn.net/weixin_44350205/article/details/105455302
類虛函數?是指整個類都是虛函數?
另外虛函數分為一般虛函數和純虛函數,純虛函數是要求派生類必須實現的,一般的虛函數如果派生類未實現,則調用父類的實現

您好,我说的 虚类函数 类似于
class A
{
static int func();
}

这里的A::func是类函数。
我就在想。既然有类函数,为什么没有 虚类函数 呢? 将func定义为 虚类函数 ,要求派生类必须实现该 类函数。直观上看上去,似乎在逻辑上没什么问题才是啊?
可是我并没学到过这种。为什么没有这样的函数呢?
  • 打赏
  • 举报
回复
虛函數是實現多態的一種重要手段 在繼承的時候子類可以有不同的實現,在編譯的時候是通過虛函數表來指向具體實現的,是動態的,在運行時指定 而static要求靜態,在編譯的時候就指定,兩個是相互衝突的 https://blog.csdn.net/weixin_44350205/article/details/105455302 類虛函數?是指整個類都是虛函數? 另外虛函數分為一般虛函數和純虛函數,純虛函數是要求派生類必須實現的,一般的虛函數如果派生類未實現,則調用父類的實現

65,187

社区成员

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

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