首页 / C++ / C++ 重定义、重载、重写
C++ 重定义、重载、重写
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++ 重定义、重载、重写,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2028字,纯文字阅读大概需要3分钟。
内容图文
![C++ 重定义、重载、重写](/upload/InfoBanner/zyjiaocheng/1245/77040054edbf4c8b9f2f5615bb3c968a.jpg)
想要用好C++继承和类自身函数实现就必须了解C++得三个概念重定义(redefine)、重载(overload)、重写(override)。
一 基本感念
1 重定义(redefine)
派生类对基类函数得重定义,派生类函数名与基类某函数同名。
特点:
- 作用域不同,既一个在基类一个在子类中;
- 函数名相同;
- 参数列表、函数返回值无要求;
特殊情况:若派生类定义的函数与基类的成员函数完全一样(名字、参数列表、返回值),且基类的该函数为virtual,则属于派生类重写基类的虚函数。
2 重载(overload)
函数名相同,参数列表不同(参数类型、参数顺序),不能用返回值区分。
特点:
- 作用域相同;
- 函数名相同;
- 参数列表必须不同,但返回值无要求;
特殊情况:若某一重载版本的函数前面有virtual关键字修饰,则表示它是虚函数,但它也是重载的一个版本。
作用效果:编译器根据函数不同的参数列表,将函数与函数调用进行早绑定,重载与多态无关,与面向对象无关,它只是一种语言特性。
3 重写(override)
派生类重定义基类的虚函数,既会覆盖基类的虚函数(多态).
特点:
- 作用域不同;
- 函数名、参数列表、返回值相同;
- 基类函数是virtual;
特殊情况:若派生类重写函数是一个重载版本,那么基类的其他同名重载函数将在子类中隐藏。
作用效果:父类指针和引用指向子类的实例时,通过父类指针或引用可以调用子类的函数,这就是C++的多态。
多态是是使用虚函数表(vtable)技术来实现的,vtable技术就不详细介绍了,这个在学习C++多态的章节有很详细的描述。
二 代码实例
三个类,一个基类,两个派生类,类定义和实现如下:
![技术分享](/upload/getfiles/default/2022/11/8/20221108072226370.jpg)
![技术分享](/img/jian.gif)
1 #include <iostream> 2 3class Base 4{ 5public: 6 7// 三个重载函数 8void fun() 9 { 10 std::cout << "base fun()" << std::endl; 11 } 12void fun(int) 13 { 14 std::cout << "base fun(int)" << std::endl; 15 } 1617virtualvoid fun(int, double) 18 { 19 std::cout << "base fun(int,double)" << std::endl; 20 } 2122}; 2324class Derive : public Base 25{ 26public: 27// 重定义基类fun函数,隐藏了基类的三个重载函数28void fun(double) 29 { 30 std::cout << "Drive fun(int)" << std::endl; 31 } 32}; 3334class Derive1:public Base 35{ 36public: 37// 重写基类的fun(int,double)函数,同时隐藏了基类的两个重载函数38void fun(int, double) 39 { 40 std::cout << "Derive1 fun(int,double)" << std::endl; 41 } 42 };
测试主程序:
![技术分享](/upload/getfiles/default/2022/11/8/20221108072226370.jpg)
![技术分享](/img/jian.gif)
int main(int argc, char* argv[]) { // 测试重载 Base b; b.fun(); //base fun() b.fun(1); //base fun(int) b.fun(1, 1.0); // base fun(int, double) // 测试重定义 Derive d; //d.fun(1, 1.0); 编译报错 d.fun(1.0); //Drive fun(int) // 拷贝切片 Base b1 = d; // 用子类对象拷贝构造基类对象的过程会发生切片,既将子类不是父类的部分裁剪掉 b1.fun(); //base fun() b1.fun(1); //base fun(int) b1.fun(1, 1.0); // base fun(int, double) b1.fun(1.0); // base fun(int) 函数的形参发生的隐式类型转换 // 测试重写 Base* p = new Derive1; p->fun(1, 30.0); // Derive1 fun(int, double) getchar(); return0; }
详细的分析如注释。运行结果如下:
原文:http://www.cnblogs.com/xueye9/p/6296176.html
内容总结
以上是互联网集市为您收集整理的C++ 重定义、重载、重写全部内容,希望文章能够帮你解决C++ 重定义、重载、重写所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。