类成员函数的重载、覆盖与隐藏之间的区别总结_C 语言

答案:
a.成员函数被重载的特征:
(1)相同的范围(比如在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

隐藏破坏了多态性,因此一般要将隐藏换成覆盖。

时间: 2024-09-20 20:37:42

类成员函数的重载、覆盖与隐藏之间的区别总结_C 语言的相关文章

关于C++类成员函数的重载、覆盖、隐藏与virtual关键字

1. 重载.覆盖与隐藏 1).重载:成员函数具有以下的特征时发生"重载" A.相同的范围(同一个类中) B.函数的名字相同 C.参数类型不同(不能进行隐式类型转换) D.Virtual关键字可有可无 2).覆盖(也叫"继承"):指派生类函数覆盖基类函数,特征是: A.不同的范围(分别位于基类与派生类中) B.函数名字相同 C.参数相同 D.基类函数必须有virtual关键字 3).隐藏:是指派生类的函数屏蔽了与其同名的基类函数,规则如下: A.如果派生类的函数与基类

c++函数中的指针参数与地址参数区别介绍_C 语言

比如 一个函数 chat(link &a): chat(ling *a): 前者引入一个地址做形参 是不是可以把一个指针变量p.. 这么用chat(p): 那跟第二个函数 有什么区别呢 都是传地址啊.. 小弟弄不明白~~ chat(int&a); chat(int *a); 这两个函数是完全不同意义的东西,你的理解主要是在int&a和int* a这个类型上面.要注意int&和int*是两个完全不同的类型.int&是引用类型,而int*是指向int类型变量的指针类型.

C++ 成员函数的重载,继承,覆盖和隐藏

一. C++成员函数的重载 C++中的成员函数有四种,分别是普通成员函数,virtual虚函数,const成员函数. (1) void func(int a); (2) virtual void func(int a); (3) void func(int a) const; 如果在一个类中,声明这四种函数,哪是重复定义?哪些是重载? 其中(1)(2)是重复定义,故编译不能通过,而(3)与(1)(2)是不同类型的函数,是重载. 成员函数被重载的特征是: (1)具有相同的作用域(即同一个类定义中)

成员函数的重载、覆盖与隐藏详细解析_C 语言

1 重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类):(2)函数名字相同:(3)参数相同:(4)基类函数必须有virtual 关键字.下面示例中,函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)覆盖. 复制代码 代码如下: #include <i

【C/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载

1.全局函数和类成员函数转化     全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std; class Test { public: Test(int a, int b) { this->a = a; this->b = b; } //成员函数 Test &Gadd2(Test &t2) { this->a = this->a + t2.a; this-&g

谈函数指针(全局/类成员函数)和函数对象

函数指针(全局函数/类成员函数).函数对象(Function object) 一. 函数指针类型为全局函数. #include "stdafx.h"#include <iostream>using namespace std;class TestAction;typedef void (*fp)(int); void Drink(int i){ cout<<"No. "<<i<<" drink..."

直接调用类成员函数地址

一.成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法.C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数.比如: class tt { public: void foo(int x){ printf("\

类成员函数作为多线程的入口函数如何访问对话框资源

问题描述 类成员函数作为多线程的入口函数如何访问对话框资源 我申请了一个类成员函数作为多线程的入口函数,如何在该函数中访问对话框资源(分割后的对话框) 解决方案 需要把类的实例作为线程函数参数传递进去.

c++,关于类成员函数作为线程的入口函数

问题描述 c++,关于类成员函数作为线程的入口函数 class Map {public: Bird *pB; Pig *pP; ..........}class Grav {public: Map *pM; ...... void runBird(Bird &b); void runPig(Pig &p); void run(Map &m);}void Grav::run(Map &m) { thread t[2]; t[0] = thread(&Grav::run