首页 > 编程语言 >C++重写(覆盖)、重载、重定义、多态

C++重写(覆盖)、重载、重定义、多态

时间:2023-03-06 13:55:05浏览次数:42  
标签:函数 多态性 派生类 多态 C++ 基类 重载 重写

引用:

https://www.cnblogs.com/DannyShi/p/4593735.html

1 重写(覆盖)override

  override是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类时,重写(覆盖)父类中的方法。函数特征相同,但是具体实现不同。

重写需要注意:

  • 被重写的函数不能是static的,必须是virtual的
  • 重写函数必须有相同的类型,名称和参数列表
  • 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public、protect也是可以的

2 重载overload

  overload是重载,一般是在一个类实现若干重载的方法,这些方法的名称相同而参数形式不同。但是不能靠返回类型来判断。

重载需要注意:

  • 位于同一个类中
  • 函数的名字必须相同
  • 形参列表不同
  • 若一个重载版本的函数面前有virtual修饰,则表示他是虚函数,但他也是属于重载的一个版本
  • 不同的构造函数(无参构造、有参构造、拷贝构造)是重载的应用

3 重定义redefining

  派生类对基类的成员函数重新定义,即派生类定义了某个函数,该函数的名字与基类中函数名字一样。

  重定义也叫做隐藏,子类重定义父类中有相同名称的非虚函数(参数可以不同)。如果一个类,存在和父类相同的函数,那么这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用时不能成功的。

重定义需要注意:

  • 不在同一个作用域(分别位于基类、派生类)
  • 函数的名字必须相同
  • 对函数的返回值、形参列表无要求
  • 若派生类定义该函数与基类的成员函数完全一样(返回值、形参列表均相同),且基类的该函数为virtual,则属于派生类重写基类的虚函数
  • 若重新定义了基类中的一个重载函数,则在派生类中,基类中该名字函数(即其他所有重载版本)都会被自动隐藏,包括同名的虚函数

4 多态polymorphism

  多态的概念比较复杂,一种不严谨的说法是:继承是子类使用父类的方法,而多态是父类使用子类的方法。

  一般我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。

  多态分为两类:静态多态性和动态多态性,以前学过的函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用哪个函数,因此静态多态性又称为编译时的多态性。静态多态性是通过函数的重载实现的。动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。动态多态性是通过虚函数实现的。

 

下面列举一个实例来说明他们:

class Base

{

private:
virtual void display() {cout<<"Base display()"<<endl;}

void say() {cout<<"Base say()"<<endl;}

public:
void exec() {display();say();}

void fun1(string a) {cout<<"Base fun1(string)"<<endl;]

void fun1(int a) {cout<<"Base fun1(int)"<<endl;}//overload,两个fun1函数在Base类的内部被重载

};

class ChildA:public Base

{

public:

void display() {cout<<"ChildA display()"<<endl;}//override,基类中的display为虚函数,故此处为重写(覆盖)

void fun1(int a,int b) {cout<<"ChildA fun1(int,int)"<<endl;}//redefining,fun1函数在Base类中不为虚函数,故此处为重定义

void say() {cout<<"ChildA say()"<<endl;}//redefining

};

class ChildB:pubic Base

{

public:

void fun1(int a) {cout<<"ChildB fun1(int)"<<endl;}//redefining

};

 

int main()

{
ChildA a;

Base* b=&a;

b->exec(); //display():version of DeriveA call(polymorphism) //say():version of Base called(allways )

//b里边的函数display被A类重写(覆盖),say还是自己的


a.exec(); //same result as last statement   
a.say();
DeriveB c;
c.f1(1); //version of DeriveB called

}

执行结果:

ChildA display()

Base say()

ChildA display()

Base say()

ChildA say()

ChildB fun1(int)

 

总结:

重写(覆盖)

  • 是指派生类函数重写(覆盖)基类函数
  • 不同的范围,分别位于基类和派生类中
  • 函数的名字相同
  • 参数相同
  • 基类函数必须有virtual关键字

重载

  • 成员函数
  • 形同的范围(在同一个类中)
  • 函数的名字相同
  • virtual关键字可有可无

重定义(隐藏)

  • 派生类屏蔽了与其同名的基类函数
  • 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏
  • 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有关键字,此时,基类的函数被隐藏

标签:函数,多态性,派生类,多态,C++,基类,重载,重写
From: https://www.cnblogs.com/liuguoyao514257665/p/17183576.html

相关文章

  • C++ 面向对象程序设计(中)
    (上)讲述了基于对象,(中)则是在基于对象的基础上,建立类与类之间的联系,即面向对象编程以及面向对象设计。主要讲述以下三点:Inheritance(继承)Composition(复合)Delega......
  • C++学生成绩管理系统[2023-03-06]
    C++学生成绩管理系统[2023-03-06]C++课程设计说明参与专业信息和数学专业所有学生时间安排完成需求分析、类设计以及代码的实现答辩注意:答辩未过的需要参加下届C++......
  • C/C++飞机订票系统[2023-03-06]
    C/C++飞机订票系统[2023-03-06]三、飞机订票系统1.某公司每天有10航班(航班号、价格),每个航班的飞机,共有80个坐位,分20排,每排4个位子。编号为A,B,C,D·如座位号:10D......
  • C/C++课程设计题目[2023-03-06]
    C/C++课程设计题目[2023-03-06]课题1:公司考勤管理系统(一)、课程设计题目:某公司的考勤管理系统(二)、目的与要求:1、目的:(1)要求学生达到熟练掌握C++语言的基本知识和技能;(2......
  • 序章 高质量C++/C编程指南
    一、文件结构避免头文件被重复引用,用#pragmaonce进行预处理用<>引用标注库头文件,用""引用自定义库头文件C语言头文件只进行函数声明,不进行函数定义;C++类的成员......
  • Python、C++、Swift或任何其他语言会取代Java吗?为什么?
    很难预测Python,C++,Swift或任何其他编程语言是否会取代Java作为最受欢迎的语言,但在不久的将来不太可能.以下是一些原因:受欢迎程度并建立的用法:Java已经存在了25年以上,并......
  • C++类和对象
                       ......
  • C++--引用和函数调用
             ......
  • C++编译小技巧
    1.单文件//math.cppintmultiply(inta,intb){returna*b;}//main.cpp#include<iostream>intmain(){ std::cout<<"Hello,world!"<<std::endl; s......
  • 虚幻c++的习惯
    枚举E打头 起名字用E加后面的驼峰  用UENUM宏标记是为了通过反射系统给蓝图使用识别,nint8是为了限制枚举的范围  可以为了使蓝图端更方便使用 加到具体的注......