C++中重写重载重定义
函数重载:
必须在同一个类中进行,子类无法重载父类的函数,父类同名函数将被名称覆盖
重载是在编译期间根据参数类型和个数决定函数调用
函数重写(使用virtual):
必须发生在父类和子类之间 并且父类和子类中的函数必须有完全相同的原型
使用virtual关键字之后能够产生多态(不使用virtual,叫重定义)
函数重定义(不使用virtual关键字)
必须发生在父类和子类之间
并且父类和子类中的函数必须有完全相同的原型
/**************************
本例子的意义在于说明重载重写重定义的关系:
特别要注意的是重载只能发生在类内部,不能发生在子类和父类之间
只要子类和父类中有同名函数,不论其参数类型异同(是否满足重载条件),
都会发生名称覆盖
***************************/
#include <cstdlib>
#include <iostream>
using namespace std;
class Parent
{
public:
Parent()
{
cout << "Parent()" << endl;
}
virtual void func()
{
cout << "Parent:void fun()" << endl;
}
virtual void func(int i)
{
cout << "Parent:void fun(int i)" << endl;
}
virtual void func(int i, int j)
{
cout << "Parent:void func(int i, int j)" << endl;
}
};
class Child : public Parent
{
public:
virtual void func(int i, int j)
{
cout << "child:void func(int i, int j)" << endl;
}
void func(int i, int j, int k)
{
cout << "Child:void func(int i, int j, int k)" << endl;
}
};
int main()
{
Child c1;
//以下调用是错的,重载只能发生在一个类中,这样调用由于名称覆盖,调用出错
//c1.func();
c1.Parent::func();//这样写才对
system("pause");
}