C++ 覆盖 重载 隐藏 override overload hidden
2016-04-21 09:22
399 查看
直接贴个链接好了,下面的别看了。很有可能是错的!
http://cboard.cprogramming.com/cplusplus-programming/146473-overloading-overriding-hiding-help.html
一般重载是指函数名相同,但是参数类型不同,与函数的返回值类型无关。重载函数发生在非成员函数中。子类和基类之间不存在重载,除非在子类中显示的加入基类的同名函数。
覆盖是指子类函数将基类虚函数覆盖,此时参数相同,且基类须有virtual修饰。覆盖的意思,就是基类的同名函数,在派生类内,将变得无法直接调用,但可以间接调用。
———————————错误开始—————————————-
~隐藏是指子类中函数与基类中函数名称相同,若~
~1. 参数类型相同,但基类函数之前没有virtual修饰,基类函数被隐藏~
~2. 参数类型不同,无论基类函数之前有无virtual修饰,基类函数都被隐藏~
———————————错误结束—————————————–
其实没有隐藏规则,C++中规定“只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用。”注意动态绑定和静态绑定就好了。
首先,函数名是相同的。
重载发生在同一个类中。覆盖发生在基类和子类中。
其次,看参数。
如果参数名相同,且有virtual修饰,为覆盖
如果参数名不同,不管virtual修饰,为覆盖,重定义基类的成员函数
三段程序,覆盖和隐藏先占坑
http://cboard.cprogramming.com/cplusplus-programming/146473-overloading-overriding-hiding-help.html
一般重载是指函数名相同,但是参数类型不同,与函数的返回值类型无关。重载函数发生在非成员函数中。子类和基类之间不存在重载,除非在子类中显示的加入基类的同名函数。
覆盖是指子类函数将基类虚函数覆盖,此时参数相同,且基类须有virtual修饰。覆盖的意思,就是基类的同名函数,在派生类内,将变得无法直接调用,但可以间接调用。
———————————错误开始—————————————-
~隐藏是指子类中函数与基类中函数名称相同,若~
~1. 参数类型相同,但基类函数之前没有virtual修饰,基类函数被隐藏~
~2. 参数类型不同,无论基类函数之前有无virtual修饰,基类函数都被隐藏~
———————————错误结束—————————————–
其实没有隐藏规则,C++中规定“只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用。”注意动态绑定和静态绑定就好了。
首先,函数名是相同的。
重载发生在同一个类中。覆盖发生在基类和子类中。
其次,看参数。
如果参数名相同,且有virtual修饰,为覆盖
如果参数名不同,不管virtual修饰,为覆盖,重定义基类的成员函数
三段程序,覆盖和隐藏先占坑
#include <iostream> using namespace std; class myclass { public: virtual void print() const { cout << "a const" << endl; } virtual void print() { cout << "a" << endl; } private: }; class myclass1 :public myclass { public: void print() const { cout << "b const" << endl; } void print() { cout << "b" << endl; } private: }; void g(const myclass* a) { a->print(); } int main() { myclass *a = new myclass1; a->print(); g(a); myclass a1; a1.print(); return 0; }
#include <iostream> using namespace std; class Base { public: virtual void print() const { cout << "Base::print() const" << endl; } void print() { cout << "Base::print()" << endl; } }; class Test : public Base { public: void print(); void print() const; }; void Test::print() { cout << "Test::print()" << endl; } void Test::print() const { cout << "Test::print() const" << endl; } class C:public Test { public: void print() { cout << "C" << endl; } void print() const { cout << "C::print() const" << endl; } private: }; void main() { Base* pChild = new Test(); pChild->print(); Test* p0 = new Test(); p0->print(); const Base *p1 = new Test(); p1->print(); }
#include<iostream> #include<string> using namespace std; class A { public: A(){} void f(){ cout << 'a' << endl; } virtual void g(){ cout << "invoke aaa" << endl; } }; class B :public A { public: B(){} virtual void g(){ cout << "invoke bbb" << endl; } void f(){ cout << 'b' << endl; } }; class C :public B { public: }; int main() { A* a = new B; A* b = new A; B* c = new B; C* d = new C; A* e = new C; a->f(); b->f(); c->f(); d->f(); e->f(); cout << "-------------------------" << endl; a->g(); b->g(); c->g(); return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 如何隐藏程序的运行
- PowerShell设置文件只读、隐藏属性的方法
- C#与.net高级编程 C#的多态介绍
- C#中面向对象编程机制之多态学习笔记
- 批处理隐藏自身窗口,很无聊
- 浅谈Lua的面向对象特性
- Lua中调用C++函数示例
- Lua面向对象之类和继承浅析
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- JavaScript面向对象的两种书写方法以及差别
- 浅谈c# 面向对象之类与对象
- C#中的多态深入理解
- C#面向对象特征的具体实现及作用详解