一.首先问题的引出
看如下代码,方便分析说明给函数编号
class parent
{
public:
//1.virtual void fun()
{
cout << "parent->fun()..." << endl;
}
//2.virtual void fun(int i)
{
cout << "parent->fun(int i) " << i << endl;
}
//3.virtual void fun(int i, int j)
{
cout << "parent->fun(int i,int j) " << i << j << endl;
}
};
class child:public parent
{
public:
//4.virtual void fun(int i, int j)
{
cout << "child->fun(int i,int j) " << i << j << endl;
}
//5.virtual void fun(int i, int j, int k)
{
cout << "child->fun(int i,int j,int k)" << endl;
}
};
int main()
{
child c1;
c1.fun();
system("pause");
return 0;
}
这样看的话会有点蒙圈,那简单的看下面这个示意图
有几个问题:
1.为什么会出现这个错误?
2.子类中的fun函数和父类中的fun函数是什么关系?
下面经过上面 的例子后我们看看真正的概念
二.函数重载与函数重写
1.函数重载:必须在同一个类中进行
子类无法重载父类函数
父类同名函数将被名称覆盖
重载是在编译器期间根据函数参数类型和个数决定函数的调用
2.函数重写:1.必须发生在父类与子类之间
2.并且父类和子类中的函数有完全相同的原型
3.使用virtual关键字声明之后能够产生多态(如果不使用virtual的重写,那叫重定义)
4.多态是在运行期间根据具体对象的类型决定函数调用
通过对上述概念的理解,我们来看上述代码的问题
①1,2,3为函数重载;4,5为重载函数
②3,4为函数重写
③如果去掉virtual关键字,3,4就是非虚函数重写,即重定义
现在看发生刚才错误的原因: 子类无法重载父类函数, 父类同名函数将被名称覆盖。
因为父类中的fun被子类中的fun覆盖,占用了父类fun函数的位置,编译器开始在子类中找fun()无参函数,没有找到,所以出现错误。
那么怎么解决呢?
加上域作用符就好了。
int main()
{
child c1;
c1.parent::fun();
system("pause");
return 0;
}