首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

无法在函数c++中使用重写

在C++中,函数重写是指在派生类中重新定义基类中已有的虚函数。然而,有一些情况下无法在函数中使用重写。

  1. 非虚函数:只有在基类中声明为虚函数的成员函数才可以被派生类重写。非虚函数在派生类中只能被隐藏,而不能被重写。
  2. 静态函数:静态函数是属于类而不是对象的函数,它们在编译时就确定了调用关系,无法被派生类重写。
  3. 构造函数和析构函数:构造函数和析构函数不能被重写,它们的调用顺序是由派生类到基类的,而不是相反的。
  4. 参数不匹配:如果派生类中的函数与基类中的函数在参数类型、参数个数或参数顺序上有任何不匹配,那么它们将被视为不同的函数,而不是重写关系。
  5. 访问权限不匹配:如果派生类中的函数的访问权限比基类中的函数更严格(例如,基类中的函数是公有的,而派生类中的函数是私有的),那么它们也不会构成重写关系。

总结起来,无法在函数中使用重写的情况包括非虚函数、静态函数、构造函数和析构函数、参数不匹配以及访问权限不匹配。在C++中,函数重写是通过在派生类中重新定义基类中的虚函数来实现的,这样可以实现多态性和动态绑定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++函数重载、隐藏、覆盖和重写的区别

3.2虚函数重写与协变返回类型 如果虚函数函数返回指针或者引用时(不包括value语义),子类重写函数返回的指针或者引用是父类中被重写函数所返回指针或引用的子类型(这就是所谓的协变返回类型)[4]^...如果派生类定义了一个与基类虚函数同名但参数列表不同的非virtual函数,则此函数是一个普通成员函数(非虚函数),并形成对基类同名虚函数的隐藏,而非虚函数覆盖(重写)。...《C++高级进阶教程》认为函数的隐藏与覆盖是两个不同的概念。隐藏是一个静态概念,它代表了标识符之间的一种屏蔽现象,而覆盖则是为了实现动态联编,是一个动态概念。...C++函数重载隐藏和覆盖的区别,并不难,难就难没弄清定义,被网上各种说法弄的云里雾里而又没有自己的理解。...关于三者的对比,李健老师《编写高质量代码:改善C++程序的150个建议》给出了较为详细的总结,如下表所示: 三者 作用域 有无virtual 函数名 形参列表 返回值类型 重载 相同 可有可无 相同

8.2K62

C++】多态 ① ( 类型兼容性原则与函数重写 | “ 多态 “ 引入 | 函数重写 )

一、类型兼容性原则与函数重写 1、" 多态 " 引入 面向对象 , " 多态 " 是 设计模式 的基础 , 是 软件框架 的基础 ; 面向对象的 三大特征 是逐步递进的 , 封装 -> 继承 ->...之后写的代码 ; 2、函数重写 函数重写 : 同时 子类 和 父类 , 定义 函数原型 相同 的 函数 , 就是 " 函数重写 " , 子类 重写 父类 函数 ; 父类 被子类 重写的...函数 , 仍然被 子类 所继承 ; 默认的情况下 , 子类 会 隐藏 父类重写函数 , 如果想要 显示调用 父类 的 被重写函数 , 可以使用 域作用符 父类名称 :: 被重写函数()... 父类 和 子类 , 都定义了 print 函数 , 子类 重写 父类的 该函数 ; // 父类 class Parent { public: Parent(int a) { x = a...int x; }; // 子类 class Child : public Parent { public: // 子类构造函数初始化列表 调用 父类构造函数 Child(int a, int

19740
  • C++】多态(定义、虚函数重写、隐藏)

    继承要构成多态还有两个条件: 必须通过基类的指针或者引用调用虚函数 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 如果是通过基类的指针调用虚函数,要如下图所示使用: 虚函数函数...注意:重写基类虚函数时,派生类的虚函数不加virtual关键字时,虽然也可以构成重写(因 为继承后基类的虚函数被继承下来了派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用函数重写的两个例外...多态的原理 虚函数表 这里的代码是x86程序,涉及的指针都是4字节。...派生类的虚表生成:1.先将基类的虚表内容拷贝一份到派生类虚表 2.如果派生类重写了基类某个虚函数,用派生类自己的虚函数覆盖虚表基类的虚函数 3.派生类自己新增加的虚函数按其派生类的声明次序增加到派生类虚表的最后...答:不能,因为静态成员函数没有this指针,使用类型::成员函数 的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 构造函数可以是虚函数吗?

    16010

    c语言random函数vc,C++ 随机函数random函数使用方法

    C++ 随机函数random函数使用方法 一、random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。 可改用C++下的rand函数来实现。...1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。...(但这样便于程序调试) 2、C++另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。...若要产生每次不同的随机数,可以使用srand( seed )函数进行随机化,随着seed的不同,就能够产生不同的随机数。...三、按要求设置概率 比如要设置一个10%的概率问题,我们可以采取rand()函数来实现,if条件句判断里,用rand()得到的值%一个设定的值,再与另一个值做“==”运算。

    5K20

    C++fstream_使用

    C++处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。...作为派生的类,它们继承了插入和提取运算符(以及其他成员函数),还有与文件一起使用的成员和构造函数。可将文件 包括进来以使用任何fstream。...被打开的文件程序由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。...要通过一个流对象打开一个文件,可以使用它的成员函数open()或直接通过构造函数。...http://www.cplusplus.com/reference/fstream/fstream/列出了fstream可以使用的成员函数

    5.5K10

    C++ 函数对象(仿函数)的使用

    函数对象,即一个重载了括号操作符“()”的对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。即重载函数调用操作符的类,其对象通常称为函数对象。...函数对象使用重载()时,行为类似函数调用,因此也叫仿函数函数对象使用时,可以像普通函数那样调用,可以有参数,可以有返回值。...void test() { Add add; cout<<add(10, 20)<<endl; } int main() { test(); return 0; } 函数对象超出普通函数的概念...cout << "Print打印输出的次数:" << p.count << endl; // 输出次数为5 } int main() { test(); return 0; } 函数对象可以使用...打印输出的次数:" count << endl; delete p; p = nullptr; } int main() { test(); return 0; } 函数对象可以作为参数进行传递

    2K30

    Java继承类static成员函数重写

    java,static成员函数是否可以被重写呢? 结论是,你可以子类重写一个static函数,但是这个函数并不能像正常的非static函数那样运行。...也就是说,虽然你可以定义一个重写函数,但是该函数没有多态特性。.../输出结果为 static in testClass1 16 tc2.SMothod(); //输出结果为 static in testClass2 17 } 18 } 从结果可以看到...,当我们用父类的实例引用(实际上该实例是一个子类)调用static函数时,调用的是父类的static函数。...如果是,则直接从调用该方法引用变量所属类中找到该方法并执行,而不再确定它是否被重写(覆盖)。如果不是,才会去进行其它操作(例如动态方法查询),具体请参考:方法的加载

    1.7K40

    详解javascript的即时函数,内部函数,能重写自身的函数即时函数内部函数返回函数函数重写自己的函数小结

    在上篇谈到匿名函数和回调函数的基础上,我们接着介绍javascript的即时函数,内部函数,返回函数函数,能重写自身的函数等几种常见的函数类型及使用方法。...显然我们可以看到使用即时函数调用完之后,所有的东西都没了销毁了,全是一次性的,不会产生任何的全局变量占用空间等等。 但也有一个缺点就是即时函数无法重复执行的,这好像就失去了函数重复调用的意义。...} } 上面这段代码,函数a的返回了一个匿名函数。 我们调用这个函数 a(); a()(); 直接调用a会返回a返回的函数 a()();的意思是调用a,调用a的返回的函数。...能重写自己的函数 我们可以一个函数的内部重定义该函数。...请注意,返回值是不带括号的,因此该结果仅仅是一个函数的引用,并不会产生函数的调用。 由于这里执行语句是以var a = 开头的所以我们这里也使用了能重写自己的函数

    1.5K10

    整理:C++sprintf()函数使用详解

    J 字符/Ascii码对照 我们知道,C/C++语言中,char也是一种普通的scalable类型,除了字长之外,它与short,int,long这些类型没有本质区别,只 不过被大家习惯用来表示字符和字符串而已...字符/Ascii 码对照   我们知道,C/C++语言中,char 也是一种普通的scalable 类型,除了字长之外,它与short,   int,long 这些类型没有本质区别,只不过被大家习惯用来表示字符和字符串而已...比如许多从第三方库函数返回的字符数组,从硬件或者网络传输读进来的字符流,它们未必每一段字符序列后面都有个相应的’’来结尾。...(2)字符/Ascii 码对照   我们知道,C/C++语言中,char 也是一种普通的scalable 类型,除了字长之外,它与short,   int,long 这些类型没有本质区别,只不过被大家习惯用来表示字符和字符串而已...printf和sprintf都使用格式化字符串来指定串的格式,格式串内部使用一些以“%”开头的格式说明符(format specification)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符

    3.1K00

    关于使用MethodHandle子类调用祖父类重写方法的探究

    关于使用MethodHandle子类调用祖父类重写方法的探究 注:这个例子原本出现在周志明先生的《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...普通的方法调用,这个this参数是虚拟机自动处理的,表示的是当前实例对象,我们方法可以直接使用。...我觉得使用bindTo绑定方法接收者要比invoke方法传递更加友好,也更加符合程序员的大众理解,invoke可以只专注方法显式的入参。 然后再来说bindTo(this)的this。...基于这个事实,我们这时可以直接在GrandFather的thinking方法调用Son类独有的方法,使用反射或者直接类型强制转换为Son就行了。...这就要回到findSpecial方法的第四个class类型的参数,即本例中使用的Father.class。

    9.5K30

    C++重载、重写(覆盖)的区别实例分析

    https://blog.csdn.net/sinat_35512245/article/details/54773552 这篇文章主要介绍了C++重载、重写(覆盖)的区别,是C++面向对象程序设计非常重要的概念...---- 本文实例讲述了C++重载、重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念。...---- 2.重写重写翻译自override,也翻译成覆盖(更好一点),是指派生类存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写函数一致。...只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数重写的基类中被重写函数必须有virtual修饰。...---- 3、总结 重载和重写的区别: (1)范围区别:重写和被重写函数不同的类,重载和被重载的函数同一类

    60430

    使用WebSocketServer类无法使用Autowired注解进行自动注入

    问题 SpringBoot项目中使用WebSocket的过程中有其他的业务操作需要注入其它接口来做相应的业务操作,但是WebSocket的Server类中使用Autowired注解无效,这样注入的对象就是空...,使用过程中会报空指针异常。...注释:上面说的WebSocket的Server类就是指被@ServerEndpoint注解修饰的类 原因 原因就是spring容器管理的是单例的,他只会注入一次,而WebSocket是多对象的,当有新的用户使用的时候...WebSocket对象,这就导致了用户创建的WebSocket对象都不能注入对象了,所以在运行的时候就会发生注入对象为null的情况; 主要的原因就是Spring容器管理的方式不能直接注入WebSocket的对象

    5.5K60
    领券