辨析

覆盖

如何覆盖?覆盖就是将基类的方法,在子类重新声明一次,然后再改写一下它的实现代码。

  • 名称、参数、返回值都必须与原方法相同

重载

重载,是同一类中,方法名相同,参数列表不同的一组方法的定义。

  • 重载只能在同一类中。
  • 不能对从基类继承来的方法进行重载,基类中重载的方法在子类中可以调用。

代码

代码一

这个程序中重载的方法不能在子类中调用,是因为同名的方法countsomething在重载后,又被覆盖。

经过修改,代码二(下一个代码块)同时实现了重载和覆盖。实现方式:对一个方法eat进行重载,对另一个方法countsomething进行覆盖。

#include<iostream>
#include<string>
//Animal基类
class Animal
{public:std::string name;//属性std::string color;//属性Animal(std::string name);//构造器void eat();void countsomething(int count_fish);void countsomething();//方法的重载
};
//子类
class Fish :public Animal
{public:Fish(std::string name);//构造器void fishspeak();void countsomething(int count_fish);//覆盖方法
};
//Animal基类构造器
Animal::Animal(std::string name)
{this->name = name;this->color = "red";
}
//Fish子类构造器
Fish::Fish(std::string name) :Animal(name)//使用的其实是基类的构造器
{this->name = name;this->color = "green";
}
//基类方法
void Animal::eat()
{std::cout << "我在Animal类,I am eating" << std::endl;
}
void Animal::countsomething(int count_fish)
{std::cout << "我在Animal类,我正在数魔鬼鱼,一共" << count_fish << "条魔鬼鱼" << std::endl;
}
void Animal::countsomething()//方法的重载
{std::cout << "(我在Animal类重载)你不告诉我有多少,我怎么数?" << std::endl;
}
//子类方法
void Fish::fishspeak()
{std::cout << "我在Fish类,我会说话,我的名字叫" << this->name << ",我的颜色是" << this->color << std::endl;//此处this可省略
}
void Fish::countsomething(int count_fish)//覆盖方法
{std::cout << "(我在Fish类覆盖)我正在数魔鬼鱼,一共" << count_fish << "条魔鬼鱼" << std::endl;
}
int main()
{Animal animal1("IAmAnimal");//创建一个基类对象animal1Fish fish1("MoGuiYu");//创建一个子类对象fish1,其name属性为MoGuiYufish1.fishspeak();//子类自己的函数fish1.countsomething(256);//子类继承的函数fish1.eat();//子类继承的函数std::cout << std::endl;animal1.countsomething();//重载的方法//重载只能在同一类中。不能对从基类继承来的方法进行重载,但基类中重载的方法可以在子类中调用//fish1.countsomething();//错误的调用,不能运行,原因:重载有效,但重载后被覆盖过std::cout << std::endl;std::cout << "基类animal1" << std::endl;std::cout << "名称:" << animal1.name << std::endl;std::cout << "颜色:" << animal1.color << std::endl << std::endl;std::cout << "子类fish1" << std::endl;std::cout << "名称:" << fish1.name << std::endl;std::cout << "颜色:" << fish1.color << std::endl << std::endl;system("pause");
}

代码二

#include<iostream>
#include<string>
//Animal基类
class Animal
{public:std::string name;//属性std::string color;//属性Animal(std::string name);//构造器void eat();void countsomething(int count_fish);void eat(int eat_num);//方法的重载
};
//子类
class Fish :public Animal
{public:Fish(std::string name);//构造器void fishspeak();void countsomething(int count_fish);//覆盖方法
};
//Animal基类构造器
Animal::Animal(std::string name)
{this->name = name;this->color = "red";
}
//Fish子类构造器
Fish::Fish(std::string name) :Animal(name)//使用的其实是基类的构造器
{this->name = name;this->color = "green";
}
//基类方法
void Animal::eat()
{std::cout << "我在Animal类,I am eating" << std::endl;
}
void Animal::countsomething(int count_fish)
{std::cout << "我在Animal类,我正在数魔鬼鱼,一共" << count_fish << "条魔鬼鱼" << std::endl;
}
void Animal::eat(int eatnum)//方法的重载
{std::cout << "(我在Animal类重载)I am eating " << eatnum << " fishes" << std::endl;
}
//子类方法
void Fish::fishspeak()
{std::cout << "我在Fish类,我会说话,我的名字叫" << this->name << ",我的颜色是" << this->color << std::endl;//此处this可省略
}
void Fish::countsomething(int count_fish)//覆盖方法
{std::cout << "(我在Fish类覆盖)我正在数魔鬼鱼,一共" << count_fish << "条魔鬼鱼" << std::endl;
}
int main()
{Animal animal1("IAmAnimal");//创建一个基类对象animal1Fish fish1("MoGuiYu");//创建一个子类对象fish1,其name属性为MoGuiYufish1.fishspeak();//子类自己的函数fish1.countsomething(256);//子类继承的函数fish1.eat();//子类继承的函数std::cout << std::endl;animal1.eat(2);//重载的方法//重载只能在同一类中。不能对从基类继承来的方法进行重载,基类中重载的方法可以在子类中调用fish1.eat(3);//重载的方法在子类中也能调用std::cout << std::endl;std::cout << "基类对象animal1" << std::endl;std::cout << "名称:" << animal1.name << std::endl;std::cout << "颜色:" << animal1.color << std::endl << std::endl;std::cout << "子类对象fish1" << std::endl;std::cout << "名称:" << fish1.name << std::endl;std::cout << "颜色:" << fish1.color << std::endl << std::endl;system("pause");
}

C++ 覆盖方法、重载方法的理解相关推荐

  1. Java 方法重载 方法重写

    方法重载规则 参数个数不同 参数个数相同,但参数列表中对应的某个参数的类型不一样 方法的返回类型和参数名称不参与重载 "编译期绑定",,因为未产生对象,只看参数.引用类型绑定方法 ...

  2. php方法重载方法重写_PHP面向对象之旅:方法覆盖

    如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重载. 当对父类的方法进行重写时,子类中的方法必须和父类中对应的方法具有相同的方法名称, ...

  3. php方法重载方法重写_Java基础之方法的重载

    重载的定义:在同一个类中,方法名相同,只要它们的参数个数或者 参数类型不同即可. // 如下的四个方法构成了重载 public void getSum(int i,int j) { System.ou ...

  4. JAVA类和对象(构造方法、方法重载、this关键字)

    Java是一门完全面向对象的编程语言:类和对象是面向对象编程的基础和核心. 面向对象的编程思想是来源于现实生活:面向对象编程是使用代码来模拟现实生活中的场景. 1.现实生活中有哪些是对象? 对象:在现 ...

  5. 七:面向对象-->方法和重载方法

    目录 7.1.对象数组 案例1: 7.2. 构造方法 7.2.1.无参构造方法 7.2.2. 有参构造方法 7.3.方法重载 7.1.对象数组 对象数组的数据类型就是具体的类名,对象数组存储的就是这个 ...

  6. java构造方法可以重载吗_Java基础教程之构造器与方法重载

    在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员 ...

  7. java 类的重载_Java自学-类和对象 方法重载

    什么是Java 方法重载 方法的重载指的是方法名一样,但是参数类型不一样 步骤 1 : attack方法的重载 有一种英雄,叫做物理攻击英雄 ADHero 为ADHero 提供三种方法 public ...

  8. Java基础03 构造器与方法重载

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initial ...

  9. 第三次学JAVA再学不好就吃翔(part16)--方法及方法重载

    学习笔记,仅供参考 文章目录 JAVA基础语法 方法概述 方法重载 JAVA基础语法 方法概述 为什么要有方法 为了提高代码的复用性 什么是方法 完成特定功能的代码块. 方法的格式 修饰符 返回值类型 ...

  10. java this关键字的使用_做java两年了,构造方法和方法重载还是搞不明白?一文帮你搞定...

    成员方法 类成员主要包括成员变量和成员方法. 带参数的成员方法 带参数的成员方法可以接受用户输入的内容.创建带参数的方法时定义的参数叫形式参数,即形参:调用方法时传入的参数叫实际参数,即实参. 语法结 ...

最新文章

  1. 医学影像阅读/分析软件FSLeyes安装避坑+核磁共振影像数据处理
  2. illegalargumentexception是什么异常_线程出现异常!应该如何处理?
  3. Spring MVC实现上传文件报错解决方案
  4. python 打包egg_将Python程序打包到egg或WHL安装包或exe包中,把,python,成,或者,whl
  5. python命令大全-深度学习中python常用命令
  6. (1)opencv的安装和遇到的问题
  7. visual basic.net 2019-判断null,is null
  8. 深入学习 History 对象管理浏览器会话历史
  9. C++(18)--复制构造函数
  10. 实现安卓里边下边播的播放器(源码公开)
  11. 通过bginfo小工具让用户自己查看用户名与IP地址信息
  12. php页面引用公共文件,WeiPHP插件模板中快速引入公共模板文件
  13. java自动生成函数注释_IDEA类和方法注释自动生成(2019-08-31 21:47写)
  14. MonkeyRunner源码分析之工作原理图
  15. 三菱梯形图转换c语言软件,三菱PLC编程软件的梯形图程序的生成与编辑
  16. 在32位Windows系统下安装Java
  17. SAP MM批次管理(1)物料与批次
  18. ArcGIS地形图配准并生成三维模型(附练习数据下载)
  19. 自定义数字时钟DigitalClockView
  20. centos6 安装 directAdmin

热门文章

  1. pythonweb开发面试_python 高级岗位面试要求
  2. ByteTrack实时多目标跟踪
  3. Xmanager远程桌面教程
  4. 排序算法-08基数排序(python实现)
  5. 浅谈文本的相似度问题
  6. 安装和使用VCLSkin美肤插件
  7. 漫游Kafka实现篇之分布式
  8. C与C++在形参的一点小区别
  9. 什么是真正的架构设计?
  10. MySQL亿级数据量实时同步,小米如何完美hold住