C++ 学习笔记 (八)重载 重写 重定义以及名字覆盖
学习c++必定会遇到重载、重写、重定义。概念的东西多也是学习c++蛋疼之处,但是还是得弄懂,学懂了也就不觉得多了。
概念,特点:
重载:
直白点说就是函数名字相同,传参的个数,类型不一样。判断标准在于传参是否相同。它有以下的特点:
1.重载只发生在同一类中。
2.子类不能重载父类的函数
3.在程序编译期间,编译器将
重写:
1.发生在子类和父类之间
2.子类虚继承(使用了virtual关键字)父类的同名函数,并且原型相同
重定义:
与重写唯一不同的在于没有使用virtual关键字
名称覆盖在后面的例程说明中进行解析。
本次笔记通过以下两个类为例子说明:
parent : child:
void abc(); void abc();
virtual void func() virtual void func(int i)
virtual void func(int i, int j)
1 class parent 2 { 3 public: 4 void abc() 5 { 6 printf("abc"); 7 } 8 9 virtual void func() 10 { 11 cout<<"func() do..."<<endl; 12 } 13 14 }; 15 16 17 class child : public parent 18 { 19 20 public: 21 void abc() 22 { 23 printf("child abc"); 24 } 25 26 virtual void func(int i) 27 { 28 cout<<"func(int i) do..."<<i<< " "<<j<<endl; 29 } 30 virtual void func(int i, int j, int k) 31 { 32 cout<<"func(int i, int j) do.."<< endl; 33 } 34 35 };
例程说明:
父类定义了两个函数:abc 和 func
1.子类中的abc与父类abc有相同原型,没有使用virtual关键字,属于重定义。
2.假如父类中的函数abc 声明为 virtual void abc(); 那么子类则是重写函数abc
3.子类的func函数定义了两个传参不同的func函数,这两个函数属于重载。
4.名字覆盖
在main函数中执行以下代码:
child c;
c.func();
4.1.将会提示:无法重载父类函数。编译失败。
4.2.在继承中子类可以调用父类的公有函数,在这里因为在子类已经有了名字为func的函数(传参不同),那么编译器会认为这是子类在重载父类的函数,在上面的概念特点描述中第一点 已经说明重载只发生在同一类中,所以重载失败。
4.3.不能直接调用父类函数是因为,子类有同名的函数,这就名字覆盖。
4.4.这种情况下如果仍要调用父类的func函数可以通过作用域符号进行解决:
c.parent::func();
上一篇: Lombok中@Builder注解
下一篇: Ajax的封装