实现重载要求函数名相同,但是参数表列 个数或顺序,类型不同。注意 不能通过返回类型来重载。
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
(5)返回值可以不同;
二、重写(也称覆盖 override)
指在派生类中重新定义基类的虚函数,特征是:
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同(或是协变),否则报错;<—-协变这个概念我也是第一次才知道…
(6)重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的
三、重定义(也成隐藏)
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆) 。
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) 。
下面通过一个demo 来加深理解:
#include<iostream>
class A {
public:
void Func1(int a) {
std::cout << "class A: Func1" << std::endl;
}
virtual void Func2(int a) {
std::cout << "class A: Func2" << std::endl;
}
virtual void Func3(int a) {
std::cout << "class A: Func3" << std::endl;
}
};
class B : public A {
public:
// redefining
void Func1(int a) {
std::cout << "class B: Func1" << std::endl;
}
// override
void Func2(int a) {
std::cout << "class B: Func2-1" << std::endl;
}
// overload
void Func2(int a, int b) {
std::cout << "class B: Func2-2" << std::endl;
}
// redefining
void Func3(char a) {
std::cout << "class B: Func3" << std::endl;
}
};
int main(int argc, char* argv[])
{
B* b = new B;
b->Func1(1);
b->Func2(1); //verify override
b->Func2(1, 1); // verify overload
b->Func3(1); //verify redifining with different params
std::cout<<"Point A"<<std::endl;
A* a = new B;
a->Func1(1);
a->Func2(1);
//a->Func2(1, 1);
a->Func3('x');
return 0;
}
参考:
http://glgjing.github.io/blog/2014/12/27/c-plus-plus-zhong-zai-,-zhong-xie-,-zhong-ding-yi-qu-bie/
http://www.cnblogs.com/tanky_woo/archive/2012/02/08/2343203.html
http://blog.youkuaiyun.com/yiya1989/article/details/17230867