为什么静态成员函数不能是虚函数

news/2024/7/5 3:42:56

在面向对象编程中,静态成员函数和虚函数都是常见的概念,但它们之间存在着本质上的差异。由于其特性上的差异,静态成员函数不能声明为虚函数。下面我们来探讨一下为什么静态成员函数不能是虚函数。

我在网上查到最多的说法是静态函数没有this指针,也就无法找到虚函数。所以静态成员函数不能是虚函数。他们的关键区别就是this指针。

我并不认可这个说法,假设一个基类指针指向一个子类地址,并且该子类完成了重写,现在我要调用该重写后的函数,过程是父类指针->vptr(虚函数表指针)->vtable(虚函数表) ->virtual(虚函数),因此我并不认为该过程需要用到this指针,除非该虚函数用了使用了类内成员。

我认为静态函数不能做虚函数主要是因为他们的概念本身就矛盾,静态函数的主要功能是提供类的全局功能,不依赖于特定对象的调用。而虚函数是用来实现多态的,多态的功能是使用统一的接口来处理不同类的对象,而无需关心对象的具体类型,从而实现代码的灵活性和可扩展性。

可以看到,静态函数的核心是不依赖对象,而多态的核心是基于不同对象,相互矛盾,因此静态成员不能是虚函数,因为没有意义,而并非技术上达不到。

以上纯属个人理解,有不同意见欢迎讨论。


http://lihuaxi.xjx100.cn/news/2121205.html

相关文章

【vue3学习之路(一)】

文章目录 前言一、vue3项目创建1.1环境准备1.1.1 基于 vue-cli 创建(脚手架创建)1.1.2 基于 vite 创建(推荐) 二、熟悉流程总结 前言 参考视频:https://www.bilibili.com/video/BV1Za4y1r7KE?p10&spm_id_frompag…

【网络建设与运维】2024年河北省职业院校技能大赛中职组“网络建设与运维”赛项规程

培训、环境、资料、考证 公众号:Geek极安云科 网络安全群:775454947 网络系统管理群:223627079 网络建设与运维群:870959784 极安云科专注于技能提升,赋能 2024年广东省高校的技能提升,在培训中我们的应急…

Java后端设置服务器允许跨域

文章目录 1、实现2、一些问题关于各项请求头的作用关于预检请求 3、一些补充4、疑问点 1、实现 以下通过servlet的Filter给所有响应的header加了一些跨域相关的数据,以实现允许跨域。 import org.springframework.context.annotation.Configuration; import org.s…

createDocumentFragment()用法总结

createDocumentFragment()用法总结 1.描述 DocumentFragments 是DOM节点。它们不是主DOM树的一部分。通常的用例是创建文档片段,将元素附加到文档片段,然后将文档片段附加到DOM树。在DOM树中,文档片段被其所有的子元素所代替。 因为文档片段存在于内存中,并不在DOM树中,…

RockyLinux8 RockyLinux9安装postgresql16-devel开发包

1、PG的插件扩展有些需要自行编译,需要安装PG开发包 2、RockyLinux8安装 #创建用户先 useradd postgressudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf -qy module disab…

十四届蓝桥杯 冶炼金属(二分 / 公式)

0322重写代码&#xff1a; #include<algorithm> #include<iostream> using namespace std;int maxx1000000010,minn-1;int main() {int n;scanf("%d",&n);for(int i0;i<n;i){int a,b;scanf("%d%d",&a,&b);maxx min(maxx,a/b)…

高中数学:复合函数基本考点整理

一、复合函数定义 类似f(g(x))或者f(f(x))这种形式的函数&#xff0c;就是复合函数 二、考点 1、复合函数的定义域 解题思路&#xff1a; 1、外函数的定义域是内函数的值域 2、确定内函数的定义域 例题 f(x)的定义域是(0,1)&#xff0c;求f(lnx)的定义域 2、复合函数的奇偶…

Linux文本编辑器vi的使用

一、文本的创建与查看 功能项命令实例作用文件创建vi /opt/learn/hello.txt在目录/opt/learn下创建文件hello.txt并进入vi编辑界面touch /opt/learn/test在目录/opt/learn下创建空白文件testcat > /opt/learn/catfile << EOF创建文件catfile并在屏幕上输入内容&#…