类中函数的重载、隐藏和覆盖

函数重载只会发生在同一个类中,函数名相同,只能通过参数类型,参数个数或者有无const来区分。不能通过返回值类型区分,而且virtual也是可有可无的,即虚函数和普通函数在同一类中也可以构成函数重载。

基类和派生类中只能是隐藏或者覆盖。
1)隐藏是指派生类中有函数与基类中函数同名,但是没有构成虚函数覆盖,就是隐藏。

隐藏的表现:若基类中函数func()被派生类中函数func()隐藏,那么无法通过派生类对象访问基类中的func() 函数,派生类对象只能访问到派生类中的func()函数。不过基类中的func()确实继承到了派生类中。

2)虚函数也只是在基类和派生类中发挥多态的作用,而在同一类中虚函数也可以重载。

虚函数实现多态的条件:

a 基类中将这些成员声明为virtual。

b 基类和派生类中的这些函数必须同名且参数类型,参数个数,返回值类型必须相同。

c 将派生类的对象赋给基类指针或者引用,实现多态。

缺少任何一条,只会是基类和派生类之间的隐藏,而不是覆盖

3) 如何判断基类和派生类中函数是否是隐藏?
     当基类和派生类存在同名函数,不论参数类型,参数个数是否相同,派生类中的同名函数都会将基类中的同名函数隐藏掉。
     a 基类和派生类都是虚函数,并且同名,但是形参类型或者形参个数不同,多态不满足,但是构成了隐藏,只是没有虚特性。           
     b 基类中不是虚函数,派生类中定义为虚函数,不构成多态,只是隐藏关系。

c 基类和派生类的两个函数同名,都是虚函数,形参的个数和类型也都相同,但是返回值类型不同,这时编译会报错,因为两个虚函数在隐藏时,返回值类型发生了冲突,因此隐藏发生错误。注意,如果这两个函数不是虚函数,这不会报错,隐藏会成功;同时,如果派生类中是虚函数,基类中不是虚函数,也不过报错,隐藏也是成功的。但是如果基类中为虚函数,派生类中不是,也会报错。这些说明,虚化并隐藏时,返回值类型一定要保持相同。

    时间: 2024-10-26 12:51:14

    类中函数的重载、隐藏和覆盖的相关文章

    C++:类成员函数的重载、覆盖和隐藏区别?

    #include <iostream> class A { public: void func() { std::cout << "Hello" << std::endl; } void func(int k) { } }; class B : public A { public: using A::func; // 把这句注释掉试试,嘿嘿 void func(int i) { } }; int main() { B b; b.func();//编译

    【非原创】C++类成员函数的重载、覆盖和隐藏

    链接:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95来源:牛客网 题目:类成员函数的重载.覆盖和隐藏区别描述正确的有? A.覆盖是指在同一个类中名字相同,参数不同 B.重载是指派生类函数覆盖基类函数,函数相同,参数相同,基类函数必须有virtual关键字 C.派生类函数与基类函数相同,但是参数不同,会"隐藏"父类函数 D.函数名字相同,参数相同,基类无virtual关键字的派生类的函数

    类成员函数的重载,覆盖和隐藏的区别

    1.成员函数被重载的特征: 相同的范围,在同一个类中 函数名字相同 参数不同 virtual关键字可有可无 2.覆盖是指派生类函数覆盖基类函数,特征: 不同的范围(分别位于派生类和基类) 函数名字相同 参数相同 基类函数必须有virtual关键字 3.隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下: a.如果派生类的函数与基类的函数同名,但是参数不同.此时,不论有无virtual关键字,基类的函数都将被隐藏(注意别与重载混淆) b.如果派生类的函数与基类的函数同名,并且参数也相同,但是基

    类成员函数的重载、覆盖和隐藏区别 (C++)

    这是本人第一次写博客,主要是想记录自己的学习过程.心得体会,一是可以方便以后回顾相关知识,二是可以与大家相互学习交流. 关于C++中类成员函数的重载.覆盖和隐藏区别,第一次看到这个问题是在准备找工作的时候在牛客网中(http://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95)看到的,后来也有遇到一些题在考察这个知识点,只要理解了他们的区别,还是可以正确的解答有关这个知识点的题.看到牛客网中有大牛的解释很好,故

    类成员函数的重载、覆盖和隐藏

    重载: ⑴同一个类中 ⑵函数名相同 ⑶参数不同 ⑷virtual关键字可有可无 覆盖: ⑴分别位于派生类与基类中 ⑵函数名字相同 ⑶参数相同 ⑷基类函数必须有virtual关键字 隐藏: ⑴如果派生类的函数与基类的函数同名,但参数不同,无论有无virtual关键字,基类的函数将被隐藏 ⑵如果派生类的函数与基类的函数同名,且参数相同,但是基类函数没有virtaul关键字,基类函数被隐藏

    C/C++知识要点3——类成员函数的重载、覆盖和隐藏的区别

    1.类成员函数的重载: 重载:如果同一作用域内的几个函数名字相同但是形参列表不同,我们称之为重载. 成员函数被重载的特征: (1)相同的范围(比如在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 2.覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类): (2)函数名字相同: (3)参数相同: (4)基类函数必须有virtual 关键字. 3.隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下: (1)如果派生类的

    类成员函数的 重载、覆盖和隐藏区别

    重载:成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 1 #include <iostream> 2 3 using std::cin; 4 using std::cout; 5 using std::endl; 6 7 class A 8 { 9 public: 10 void show(int val) { cout << val; } 11 void show(double val)

    类成员函数的重载、覆盖和隐藏区别?

    1.重载是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同).实现原理上:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的).如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;.那么编译器做过修饰后的函数名称可能是这样的:int_func.str_func.对于这两个函数的调用,在编

    类中函数

    [1]空类为什么可以创建对象呢? 示例代码如下: 1 class Test 2 { 3 }; 4 void main() 5 { 6 Test t1; 7 cout<<sizeof(Test)<<endl; //1 8 } 让我们先看看这个例子.既然都没有构造函数,怎么实现对象t1的构建呢? 哦,经过大脑的回旋式搜索,忆得有一本书上说过,当用户定义一个空类(如上)时,编译器就会为这个类默认生成六个方法. 既然这是编译器完成的工作,那我们只要知道是那些方法就好了,其余就学习编译器的结