C++学习笔记26,虚函数
2023-09-11 14:21:01 时间
在C++里面,虚拟功能是功能的一类重要!不同目的可以通过在不同的虚拟功能来达到同样的动作被定义。
举一个简单的例子:
#include <iostream> #include <string> using namespace std; class Animal{ protected: string name; public: Animal(const string &s):name(s){ } virtual ~Animal(){ } virtual void speak()const{ cout<<"I'm a Animal!"<<endl; } }; class Dog:public Animal{ public: Dog(const string &s):Animal(s){ } virtual ~Dog(){ } virtual void speak()const override{ cout<<"This's a Dog!"<<endl; } }; int main(){ Animal a("AnimalOne"); Dog d1("DogOne");
<span style="white-space:pre"> </span>//用指针调用speak() Animal *p1=&a; Animal *p2=&d1; p1->speak(); p2->speak(); <span style="white-space:pre"> </span>//用引用调用speak() Animal &r1=a; Animal &r2=d1; r1.speak(); r2.speak(); return 0; }结果:
能够看出,通过指针和引用能够调用相应的虚函数.即便指针和引用都声明为Animal 类型,可是却能够调用相应的函数(Dog::speak()).
因此,假设须要在派生类中又一次定义基类的方法,应该将该方法设置为虚方法.
须要注意的是仅仅有指针和引用才干正确引发对应的虚函数.同一时候函数必须声明为虚的.假设不是的话,将仅仅会调用对应的类成员函数.
比如:
#include <iostream> #include <string> using namespace std; class Animal{ protected: string name; public: Animal(const string &s):name(s){ } virtual ~Animal(){ } void speak()const{ cout<<"I'm a Animal!"<<endl; } }; class Dog:public Animal{ public: Dog(const string &s):Animal(s){ } virtual ~Dog(){ } void speak()const { cout<<"This's a Dog!"<<endl; } }; int main(){ Animal a("AnimalOne"); Dog d1("DogOne"); Animal *p1=&a; Animal *p2=&d1; p1->speak(); p2->speak(); Animal &r1=a; Animal &r2=d1; r1.speak(); r2.speak(); return 0; }执行结果:
假设成员函数不是虚的,就不能达到这种效果.这就是动态绑定.
再看一个样例:
#include <iostream> #include <string> using namespace std; class Animal{ protected: string name; public: Animal(const string &s):name(s){ } virtual ~Animal(){ } //非虚函数 void eat()const{ cout<<"Animal eat!"<<endl; } //不被重写的虚函数 virtual void run()const{ cout<<"Animal run!"<<endl; } //会被重写的虚函数 virtual void speak()const{ cout<<"I'm a Animal!"<<endl; } }; class Dog:public Animal{ public: Dog(const string &s):Animal(s){ } virtual ~Dog(){ } //新定义的函数eat,将掩盖旧的版本号,非重写(重写是指重写virtual函数) void eat()const{ cout<<"Dog eat!"<<endl; } //重写speak() virtual void speak()const override{ cout<<"This's a Dog!"<<endl; } }; int main(){ Animal a("AnimalOne"); Dog d1("DogOne"); Animal *p1=&a; Animal *p2=&d1; p1->speak(); p2->speak(); p1->eat(); p2->eat(); //call Animal::eat() p1->run(); p2->run(); //call Animal::run() Animal &r1=a; Animal &r2=d1; r1.speak(); r2.speak(); r1.eat(); r2.eat(); r1.run(); r2.run(); return 0; }
结果:
版权声明:本文博客原创文章,博客,未经同意,不得转载。
相关文章
- 传智播客c/c++公开课学习笔记--邮箱账户的破解与邮箱安全防控
- C++网络编程笔记
- 《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射
- c++ vector 初始化_C++--vector()的用法
- C++ muduo网络库 学习笔记之:Reactor框架总览
- C++ Primer 学习笔记_88_用于大型程序的工具 --异常处理[续1]
- 《C++ Primer Plus》学习笔记3
- Ubuntu20.04下,qt交叉编译报错::15: warning: identifier ‘nullptr‘ is a keyword in C++11 [-Wc++0x-compat]
- 《Effective C++ 》学习笔记——条款03
- Lua学习笔记6:C++和Lua的相互调用
- OpenCV(C++接口)学习笔记1-图像读取、显示、保存
- C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】
- C++primer学习笔记(二)——Chapter 4
- 第十三届蓝桥杯C++C组省赛H题,Python A 组省赛 F 题,Ptyhon C 组省赛 H 题—— 重新排序(AC)
- 黑马C++笔记——简易通讯录
- C++标准库 -- 关联容器 (Primer C++ 第五版 · 阅读笔记)
- C++基础知识要点--类(Primer C++ 第五版 · 阅读笔记)
- C/C++学习笔记 资源获取是初始化 (RAII) 理解
- C/C++学习笔记十二 Input and Output (I/O)(3)
- C/C++学习笔记十
- C/C++学习笔记六
- C/C++学习笔记二
- 【学习笔记】C++ 编程规范——101条规则、准则与最佳实践