函数重载:
1. 必须在同一个类中进行;
2. 子类无法重载父类的函数,父类重名函数将会被覆盖;
3. 重载是在编译阶段根据参数类型和个数决定函数调用。
函数重写与重定义
1. 必须发生在子类与父类之间;
2. 父类和子类中的函数必须完全相同的原型;
3. 使用virtual声明之后能够产生多态,如果不是用virtual称为重定义;
4. 多态是在运行期间根据具体对象的类型决定函数调用。
1、重载
首先说重载,它最简单,C++中的重载和java中的差不多,都是在一个类中,方法名相同而参数不同的几个方法,但是不能靠返回类型来判断。例如:
class AA
{
public:
void print()
{
cout << "父类" << endl;
}
void print(int x )
{
cout << "父类:" << x << endl;
}
};
上面的两个方法就属于重载。
2、重定义
重定义 (redefining)也叫做隐藏:
子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。
class AA
{
public:
void print()
{
cout << "父类" << endl;
}
};
class BB : public AA
{
public:
void print(int x)//这叫重定义,此时A类中的print()被隐藏
{
cout << "子类:" << x << endl;
}
};
void main()
{
int x = 1;
BB b; //子类
AA a; //父类
a.print();//访问父类的print()
b.print(x);//访问子类的print()
b.AA::print();//访问父类的print()
//b.print();error:函数参数太少
}
这种情况下print()和print(int x)叫作重定义,在重定义时,父类的print()方法被隐藏了,要想使用父类的方法必须通过::。
3、重写(也叫覆盖)
函数特征相同。但是具体实现不同,主要是在继承关系中出现的 。当我们对别人提供好的类的方法感觉不是太满意时,我们就可以通过继承这个类然后重写其方法改成我们需要的逻辑。
1、最重要的一点,重写是子类与父类之间的。
2、被重写的函数不能是 static 的。
3、函数三要素(函数名、函数参数、函数返回类型)完全一样
4、如果父类中有virtual关键字,这种父子之间的关系叫做虚函数重写,这也就是C++中的多态机制,和java自动转换不同的是,C++需要我们手动设置。
例如:
class AA
{
public:
virtual void print(int x )
{
cout << "父类:" << x << endl;
}
};
class BB : public AA
{
public:
virtual void print(int x)
{
cout << "子类:" << x << endl;
}
};
int main()
{
AA *p = NULL;
BB b;
p = &b;
p->print(1);
}
这个输出结果取决于AA类中的void print(int x )函数前面是否加入virtual关键字,如果加了则调用子类的,否则父类。