C++ 覆盖方法、重载方法的理解
辨析
覆盖
如何覆盖?覆盖就是将基类的方法,在子类重新声明一次,然后再改写一下它的实现代码。
- 名称、参数、返回值都必须与原方法相同
重载
重载,是同一类中,方法名相同,参数列表不同的一组方法的定义。
- 重载只能在同一类中。
- 不能对从基类继承来的方法进行重载,基类中重载的方法在子类中可以调用。
代码
代码一
这个程序中重载的方法不能在子类中调用,是因为同名的方法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++ 覆盖方法、重载方法的理解相关推荐
- Java 方法重载 方法重写
方法重载规则 参数个数不同 参数个数相同,但参数列表中对应的某个参数的类型不一样 方法的返回类型和参数名称不参与重载 "编译期绑定",,因为未产生对象,只看参数.引用类型绑定方法 ...
- php方法重载方法重写_PHP面向对象之旅:方法覆盖
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重载. 当对父类的方法进行重写时,子类中的方法必须和父类中对应的方法具有相同的方法名称, ...
- php方法重载方法重写_Java基础之方法的重载
重载的定义:在同一个类中,方法名相同,只要它们的参数个数或者 参数类型不同即可. // 如下的四个方法构成了重载 public void getSum(int i,int j) { System.ou ...
- JAVA类和对象(构造方法、方法重载、this关键字)
Java是一门完全面向对象的编程语言:类和对象是面向对象编程的基础和核心. 面向对象的编程思想是来源于现实生活:面向对象编程是使用代码来模拟现实生活中的场景. 1.现实生活中有哪些是对象? 对象:在现 ...
- 七:面向对象-->方法和重载方法
目录 7.1.对象数组 案例1: 7.2. 构造方法 7.2.1.无参构造方法 7.2.2. 有参构造方法 7.3.方法重载 7.1.对象数组 对象数组的数据类型就是具体的类名,对象数组存储的就是这个 ...
- java构造方法可以重载吗_Java基础教程之构造器与方法重载
在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员 ...
- java 类的重载_Java自学-类和对象 方法重载
什么是Java 方法重载 方法的重载指的是方法名一样,但是参数类型不一样 步骤 1 : attack方法的重载 有一种英雄,叫做物理攻击英雄 ADHero 为ADHero 提供三种方法 public ...
- Java基础03 构造器与方法重载
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initial ...
- 第三次学JAVA再学不好就吃翔(part16)--方法及方法重载
学习笔记,仅供参考 文章目录 JAVA基础语法 方法概述 方法重载 JAVA基础语法 方法概述 为什么要有方法 为了提高代码的复用性 什么是方法 完成特定功能的代码块. 方法的格式 修饰符 返回值类型 ...
- java this关键字的使用_做java两年了,构造方法和方法重载还是搞不明白?一文帮你搞定...
成员方法 类成员主要包括成员变量和成员方法. 带参数的成员方法 带参数的成员方法可以接受用户输入的内容.创建带参数的方法时定义的参数叫形式参数,即形参:调用方法时传入的参数叫实际参数,即实参. 语法结 ...
最新文章
- 医学影像阅读/分析软件FSLeyes安装避坑+核磁共振影像数据处理
- illegalargumentexception是什么异常_线程出现异常!应该如何处理?
- Spring MVC实现上传文件报错解决方案
- python 打包egg_将Python程序打包到egg或WHL安装包或exe包中,把,python,成,或者,whl
- python命令大全-深度学习中python常用命令
- (1)opencv的安装和遇到的问题
- visual basic.net 2019-判断null,is null
- 深入学习 History 对象管理浏览器会话历史
- C++(18)--复制构造函数
- 实现安卓里边下边播的播放器(源码公开)
- 通过bginfo小工具让用户自己查看用户名与IP地址信息
- php页面引用公共文件,WeiPHP插件模板中快速引入公共模板文件
- java自动生成函数注释_IDEA类和方法注释自动生成(2019-08-31 21:47写)
- MonkeyRunner源码分析之工作原理图
- 三菱梯形图转换c语言软件,三菱PLC编程软件的梯形图程序的生成与编辑
- 在32位Windows系统下安装Java
- SAP MM批次管理(1)物料与批次
- ArcGIS地形图配准并生成三维模型(附练习数据下载)
- 自定义数字时钟DigitalClockView
- centos6 安装 directAdmin