【C++】【学习笔记】【019】覆盖方法和重载方法
来源:互联网 发布:软件周期模型 编辑:程序博客网 时间:2024/05/16 12:43
覆盖方法:
1、当我们需要在基类里提供一个通用的函数,但在它的某个子类里需要修改这个方法的实现,在C++里,覆盖(overriding)就可以做到。简言之,覆盖方法就是共性里面寻找特性;
2、覆盖的实现:在子类里重新声明这个方法,然后再改写一下它的实现代码就行了,就像是一个新增加的方法一样;
3、子类里的方法,如果和基类里的方法名字一样,不管参数是否一样,都会把基类里的所有同样名字的方法覆盖的;
样例:为Animal添加eat()方法,并在Pig和Turtle中进行覆盖;
#include <iostream>#include <string>// 动物基类class Animal{public: std::string mouth; void eat(); void sleep(); void drool(); // 流口水};void Animal::eat(){ std::cout << "Animal: I'm eating!" << std::endl;}void Animal::sleep(){ std::cout << "Animal: I'm sleeping!" << std::endl;}void Animal::drool(){ std::cout << "Animal: I'm drooling!" << std::endl;}// 猪子类class Pig : public Animal{public: void climb(); void eat();};void Pig::climb(){ std::cout << "Pig: I'm climbing!" << std::endl;}// 覆盖基类的eat方法void Pig::eat(){ Animal::eat(); std::cout << "Pig: I'm eating!" << std::endl;}// 乌龟子类class Turtle : public Animal{public: void swim(); void eat();};void Turtle::swim(){ std::cout << "Turtle: I'm swimming!" << std::endl;}void Turtle::eat(){ Animal::eat(); std::cout << "Turtle: I'm eating!" << std::endl;}int main(){ Pig pig; Turtle turtle; pig.eat(); turtle.eat(); pig.climb(); turtle.swim(); return 0;}
输出:Animal: I'm eating!Pig: I'm eating!Animal: I'm eating!Turtle: I'm eating!Pig: I'm climbing!Turtle: I'm swimming!
重载方法:
1、重载机制:使得可以定义多个同名的方法(函数),只是他们的输入参数必须不同。编译器是依靠不同的输入参数来区分不同的方法;
2、重载并不是一个真正的面向对象特性,它只是可以简化编程工作的捷径,而简化编程工作正是C++的全部追求;
注意:
1、对方法(函数)进行重载一定要有的放矢,重载的方法(函数)越多,程序就越不容易看懂;
2、对方法进行覆盖(注意区分覆盖和重载)时一定要看仔细,因为只要声明的函数输入参数和返回值与原来的不一致,则该方法将是一个重载方法而不是覆盖方法。这种错误很难调试;
3、对从基类继承来的方法进行重载,程序永远不会像预期的那样工作(继承之后尝试的重载本质上是覆盖);
样例:为Animal添加eat(int eatCount)方法,进行重载;
#include <iostream>#include <string>// 动物基类class Animal{public: std::string mouth; void eat(); void eat(int eatCount); void sleep(); void drool(); // 流口水};void Animal::eat(){ std::cout << "Animal: I'm eating!" << std::endl;}void Animal::eat(int eatCount){ std::cout << "Animal: I'm eating " << eatCount << " foods." << std::endl;}void Animal::sleep(){ std::cout << "Animal: I'm sleeping!" << std::endl;}void Animal::drool(){ std::cout << "Animal: I'm drooling!" << std::endl;}// 猪子类class Pig : public Animal{public: void climb();};void Pig::climb(){ std::cout << "Pig: I'm climbing!" << std::endl;}// 乌龟子类class Turtle : public Animal{public: void swim();};void Turtle::swim(){ std::cout << "Turtle: I'm swimming!" << std::endl;}int main(){ Pig pig; Turtle turtle; pig.eat(); turtle.eat(); pig.eat(2); pig.climb(); turtle.swim(); return 0;}
输出:Animal: I'm eating!Animal: I'm eating!Animal: I'm eating 2 foods.Pig: I'm climbing!Turtle: I'm swimming!
样例:为Pig从Animal继承来的方法eat()进行重载(本质是覆盖);
#include <iostream>#include <string>// 动物基类class Animal{public: std::string mouth; void eat(); void sleep(); void drool(); // 流口水};void Animal::eat(){ std::cout << "Animal: I'm eating!" << std::endl;}void Animal::sleep(){ std::cout << "Animal: I'm sleeping!" << std::endl;}void Animal::drool(){ std::cout << "Animal: I'm drooling!" << std::endl;}// 猪子类class Pig : public Animal{public: void eat(int eatCount); void climb();};void Pig::eat(int eatCount){ std::cout << "Pig: I'm eating " << eatCount << " foods." << std::endl;}void Pig::climb(){ std::cout << "Pig: I'm climbing!" << std::endl;}// 乌龟子类class Turtle : public Animal{public: void swim();};void Turtle::swim(){ std::cout << "Turtle: I'm swimming!" << std::endl;}int main(){ Pig pig; Turtle turtle; pig.eat(); <span style="color:#ff0000;">// 这里编译出错!!</span> pig.eat(2); turtle.eat(); pig.climb(); turtle.swim(); return 0;}
||=== Build: Debug in test_cpp (compiler: GNU GCC Compiler) ===|D:\13....SVNLib\01.Exercise\03.CPP\test_cpp\main.cpp||In function 'int main()':|D:\13....SVNLib\01.Exercise\03.CPP\test_cpp\main.cpp|65|error: no matching function for call to 'Pig::eat()'|D:\13....SVNLib\01.Exercise\03.CPP\test_cpp\main.cpp|65|note: candidate is:|D:\13....SVNLib\01.Exercise\03.CPP\test_cpp\main.cpp|37|note: void Pig::eat(int)|D:\13....SVNLib\01.Exercise\03.CPP\test_cpp\main.cpp|37|note: candidate expects 1 argument, 0 provided|||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
0 0
- 【C++】【学习笔记】【019】覆盖方法和重载方法
- 方法覆盖和方法重载
- 方法重载和方法覆盖
- 【c++】访问控制、覆盖方法和重载方法
- java方法重载和覆盖
- 方法的重载和覆盖
- Objective-C 中方法的重载,覆盖和隐藏
- Objective-C 的方法原型及重载和覆盖
- Objective-C 的方法原型及重载和覆盖
- 方法重载、方法覆盖和多态
- 细说C++覆盖方法和重载方法
- java方法重载和方法覆盖
- Java---方法重载和方法覆盖
- 方法重载和方法覆盖的区别
- java方法覆盖和方法重载
- C#:区分:重写、覆盖和重载以及虚方法和抽象方法
- java方法的重载、覆盖和隐藏
- C#之方法重载和覆盖
- Python - 素数筛
- 换行符‘\n’和回车符‘\r’
- 第11周项目二求两个数最大的公约数
- NDK开发环境搭建_r8
- Java内部类与迭代器设计
- 【C++】【学习笔记】【019】覆盖方法和重载方法
- 数据结构与算法学习之路:简单的哈希表实现(链地址法解决冲突)
- Codeforces Round #223 (Div. 1) C. Sereja and Brackets
- Unity3d 发射射线Ray
- HDU—— 2137 circumgyrate the string
- www
- LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 第11周 项目6-7 输出10000以内的所有可逆素数
- POJ 2780 Linearity