当前位置:
首页 >
C++ 覆盖方法、重载方法的理解
发布时间:2024/2/28
40
豆豆
生活随笔
收集整理的这篇文章主要介绍了
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++ 覆盖方法、重载方法的理解的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: C语言 ungetc将变量存放的字符返回
- 下一篇: C++ 友缘关系