Override c++(C++ 覆盖与重写是不是一回事)

2024-03-18 22:00:03 :36

override c++(C++ 覆盖与重写是不是一回事)

大家好,关于override c++很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于C++ 覆盖与重写是不是一回事的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文目录

C++ 覆盖与重写是不是一回事

覆盖与重写可以说是一样的,但与重载不同。override(重写)是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数。在C++中,经常发生在类的继承中。当基类中的某个方法是virtual或pure virtual函数时(当然访问权限必须是public或protected,因为从C++设计思想上来讲private的函数不会是virtual的,呵呵),其子类中对该方法的重新实现就属于override。使用时,可以通过基类的指针或者引用所指向的具体对象来确定调用的是哪个方法,从而实现函数的多态。对于基类中的非virtual类型的成员函数,若其子类中也声明了与该函数名称相同的函数,那么基类中的该函数(也许是一系列函数,如果该函数在基类中有重载的话,呵呵)将被隐藏,可以通过域解析操作符来调用。不过按照C++的设计思想来说呢,基类中的非virtual类型的成员函数,是不需要在子类中进行修改的,所以如果在子类中出现了这种隐藏的情况,说明应该将基类中的该函数改成virtual类型的,然后就是override了。overload(重载)则是指在相同作用域中,多个函数具有相同的名字,但参数的数目和类型各不相同(当然相同数目和类型,如果顺序不同也是可以的),因为函数重载的机制是在C++中函数的签名与其参数有关,而不像C中,只与函数名有关。总之,override与overload的一个最大的区别就是作用域不同,以及函数原型是否相同,呵呵。 函数的重载(overload)覆盖(override)隐藏派生类的函数与基类的函数完全相同(函数名和参数列表都相同),只是基类的函数没有VIRRUAL关键字.些时基类的函数将被隐藏,而不是覆盖.派生类的函数与基类的函数同名,但参数列表不同,在这种情况下,不管基类的函数声明是否有VIRRUAL关键字,基类的函数都将被隐藏.注意这种情况与重载的区别,重载发生在同一个类中。

c++重载(overload)和重写(override)的区别和虚函数

overload是同一个函数名,根据参数的不同实现不同的功能。例子:void add(int a, int b){ return a+b;}void add(float a, float b){ return a+b;}override就是你例子里的重写父类的函数,以实现virtual的功能,基类的指针根据具体带入对象可以调用子类的virtual函数virtual函数的意义是你用基类的指针去引用子类的对象时,可以调用子类的函数,这点普通函数是不行的。A* p=new B();p-》normal_func() //将调用基类的定义p-》virtual_func() //将调用子类的定义至于你的例子里面为什么能带入char类型,我估计是想展示overload的用法,但是代码里面没有写出来

关于c++中虚函数和接口的关系区分

确切说, C++中并没有专门的“接口”的这个东西。像JAVA,C#就有。

C++中有virtual声明的虚函数,在继承上 override实现多态。

这里C++就还有一个概念“纯虚函数”,是指没有函数实现的虚函数,在虚函数声明后加"=0"。

//A.hclass A{public:    virtual void fun1(); //虚函数,必须要有函数体实现    virtual void fun2() = 0; //纯虚函数,不能有函数体实现。}

//A.cppvoid A::fun1(){    //函数体}//不能再有fun2的函数体

带有至少一个纯虚函数的类叫虚类,它不能用来实例化,即不能用它来声明一个对象。这种类规定了一些方法签名,有点像接口了,姑且叫“半接口”(非正规概念)吧,只能用来给派生类继承并override实现的。

//B.hclass B{public:    virtual void fun1() = 0; //纯虚函数,不能有函数体实现。    virtual void fun2() = 0; //纯虚函数,不能有函数体实现。}

看上面类B的成员函数都是纯虚函数,也没有确切的概念,它是一种特殊的虚类,姑且叫纯虚类吧,它就是JAVA和C#里的interface了。而C++没有interface关键字。

为什么需要override关键字求解

C++就没有这个关键字,在声明虚函数时,只需要在函数声明前加上关键字virtual,而在重载虚函数时virtual则是可选的。即使在子类中写上了virtual,也并不清楚这个函数是被首次声明,还是重载了基类中的虚函数。更为严重的是,如果不看基类的声明或借助注释,根本没有办法知道一个函数是否是虚函数(我是指程序员看源代码时不知道,运行时的方法不在此讨论范围内)。有一次我整理数个月前写的C++代码,看到其中一个类成员函数只是简单的返回了一个成员变量的值,我觉得这样的成员函数应该声明为const,从而也能适用于const实例的情况。但就这样一来程序运行结果不正确了,经过仔细的跟踪,我才发现原来这个函数在基类中就被声明为virtual,子类中这个版本实际上是个重载版本,而我加上const后导致它的签名和基类中的版本不一样了,从而编译器不再认为它重载了基类中的虚函数,而是一个全新的函数了。对此编译器不能给出任何有用的信息,只能人工一点一点的检查。而如果像C#那样要求使用C#关键字,子类中的重载版本就必须加上override,这样一来一眼就可以知道它是个重载方法,我们也就不会随意改动它的签名了。override的要求是:1 对于非重载方法,不能添加override关键字,否则会产生编译错误2 对于重载方法,必须使用override关键字;如果要隐藏基类中的方法,则需要使用new关键字3 与IDE相配合,只要在Visual Studio.Net中输入override并空格,就可以自动列出基类中所有可重载的方法对此,我想借助C++的typedef、模板或宏的功能,也许可以模拟出override关键字的功能我的一种不成形的想法是:1 把VIRTUAL定义为virtual,并再进行一个关于所编写的虚函数名的宏定义,把它定义为不合法,使得子类中直接重载它时就会产生编译时错误2 定义OVERRIDE,它先检查是否已经有了对所重载函数名的不合法定义,如果没有,就定义一个不合法的结果,从而产生编译期错误,这样一来就不能对非重载函数应用OVERRIDE关键字3 如果已经有了不合法定义,让它先取消对所重载函数名的不合法定义,然后正常的重载,重载后再重新进行不合法定义,这样一来就可以正确的重载虚函数4 但这样还有一些问题,就是在写重载函数的实现时,以及调用被这样声明的函数时,都会有一些问题,因为相应的函数名已经被定义为不合法,不能直接使用。可能还需要进行更复杂的宏定义才能解决。想法如此,但具体实现起来问题也不少,我还没有实验成功,先把想法保存于此,备查。

【c++】虚函数比起一般函数有哪方面的优势

一般(类中)函数能实现的是成员函数的重载(Overload),是指函数名相同,而函数参数表不同,可以通过不同的参数表来调用同个函数名的函数。虚函数是针对基类和派生类的继承关系来说的,是为了实现多态性而定义的。基类中定义了了一个虚函数,派生类可以通过改写(Override)该函数来获得新的定义,改写的函数名,函数参数表,返回类型都必须和基类的虚函数相同(基类若返回类类型,派生类可返回从基类返回类派生的类类型)。因此,这2种是完全不同的。通过下面的例子就可以清楚地看出区别:class test{public: void func(int num) { cout《《"func(int)"《《endl; } void func(float num) { cout《《"func(float)"《《endl; {};这是函数的重载,使用的时候:int a=5;float b=3.6f;test t;t.func(a);//调用func(int)t.func(b);//调用func(float)class Person{public: virtual void talk() { cout《《"Person talk"; }};class Student : public Person{public: void talk() { cout《《"Student talk"; }};这是虚函数的改写。使用时:Person p;Person *p1=&pp1-》talk();//调用Person::talk()Student s;p1=&sp1-》talk();//调用Student::talk()这里根据基类指针p1的指向类型不同,调用的函数也不相同,但是调用的语句是一样的。

一道c++改错题

看到了几处错误

  1. B中的虚函数f2和f3被final修饰,因此不能在其子类D中重写。

  2. D中的f3还有一个错误是override关键字运用错误。override关键字必须是重写基类中声明为虚拟的 (virtual)成员函数。因此可以将B中的f3前面加一个virtual关键字修饰,或者在D中去f3后面的override关键字

  3. D中的g1也是多余了override的关键字。因为在B中根本不存在的g1,当然也就无所谓重写的说法了。

  4. B中的f函数为一个纯虚函数,如果其子类D不实现该函数,其子类也是一个虚类,不能被实例化的。因此可以在子类D中实现函数f。

  5. B中不存在无参的构造方法

以上就是我们为大家找到的有关“override c++(C++ 覆盖与重写是不是一回事)”的所有内容了,希望可以帮助到你。如果对我们网站的其他内容感兴趣请持续关注本站。

override c++(C++ 覆盖与重写是不是一回事)

本文编辑:admin
override c++ ,不
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.