1.overload(重载)
这个没什么歧义的。就是在同一个命名空间(或者作用域)中,函数具有相同的名字,但参数类型(包括const修饰)或参数个数不同,被编译器编译成不同函数。
2.override(覆盖、覆写、重写)
override是指在类继承结构中,子类对父类的virtual方法(函数)进行重新定义。
virtual关键字,告诉编译器这个函数要支持多态。不是根据指针类型判断如何调用,而是要根据指针所指向的实际对象类型来判断如何调用。
父类重载的方法不会被子类方法覆盖,通过父类指针(引用)指向子类的指针仍可直接调用父类重载的方法。
#include <iostream>
#include <stdio.h>
using namespace std;
class AA{
public:
virtual void print()
{
cout<<"I am AA"<<endl;
}
virtual void print(int a)
{
cout<<"I am AA:"<< a<<endl;
}
void print(int a1,int a2)
{
cout<<"I am AA:"<<a1<<","<<a2<<endl;
}
private:
int aa;
};
class BB :public AA{
public:
virtual void print()
{
cout<<"I am BB"<<endl;
}
private:
int bb;
};
int main(void)
{
AA a1;
BB b1;
AA *pa = &b1;
pa->print();
pa->print(3);
pa->print(3,5);
}
输出:
I am BB
I am AA:3
I am AA:3,5
3.overwrite(重写、改写、复写)
是指在类继承结构中,子类对父类的l方法(函数)进行重新定义。
父类重载的方法会被子类方法覆盖,子类的对象或子类对象的指针(引用)。不能直接调用父类重载的方法(非 virtual方法),需要用到作用域运算符。如果没有overwrite,则可以。
由于是非virtual方法,所以指针、引用、对象 是什么类型的,就按什么类型的用。用父类指针会引用指向子类,调用的是父类的方法(非virtual方法)。
#include <iostream>
#include <stdio.h>
using namespace std;
class AA{
public:
void print2()
{
cout<<"I am AA"<<endl;
}
void print2(int a)
{
cout<<"I am AA"<<a<<endl;
}
private:
int aa;
};
class BB :public AA{
public:
void print2()
{
cout<<"I am BB"<<endl;
}
private:
int bb;
};
int main(void)
{
AA a1;
BB b1;
AA *pa = &b1;
pa->print2();
pa->print2(5);
b1.print2();
// b1.print2(7);
}
输出:
I am AA
I am AA5
I am BB
b1.print2(7)会报错
#include <iostream>
#include <stdio.h>
using namespace std;
class AA{
public:
virtual void print2()
{
cout<<"I am AA"<<endl;
}
void print2(int a)
{
cout<<"I am AA"<<a<<endl;
}
private:
int aa;
};
class BB :public AA{
public:
void print2()
{
cout<<"I am BB"<<endl;
}
private:
int bb;
};
int main(void)
{
AA a1;
BB b1;
AA *pa = &b1;
pa->print2();
pa->print2(5);
b1.print2();
// b1.print2(7);
}<pre name="code" class="cpp">输出:
I am BB
I am AA5
I am BB
b1.print2(7)会报错