重载(overload)与重写(override),区别很大呀
看了很多帖子好多人在发布内容里对于“重写”和“重载”两者描述不清,容易让人误解。晚上特意从《C++PrimerPlus(第6版)》学习了相关内容,整理成代码和注释,记录下来。
重载(overload)
重载一般包括运算符重载和相同作用域下的函数重载,运算符重载是为了让一些结构体或类具有类似加减乘除这样的运算符功能,本质上也是函数,函数重载就是相同的函数名称不同的参数,下面看代码:
#include <iostream>
class MulitInt
{
public :
int m;
int n;
MulitInt() { m = n = 0; }
MulitInt(int x, int y) : m(x), n(y) {}
MulitInt operator +(MulitInt val) const
{
return MulitInt(m + val.m, n + val.n);
}
void Add(int x)
{
m += x;
n += x;
}
void Add(int x, int y)
{
m += x;
n += y;
}
};
int main()
{
MulitInt mi1(1, 2);
MulitInt mi2(3, 4);
MulitInt res = mi1 + mi2;
MulitInt mi3;
mi3.Add(1);
mi3.Add(2, 3);
int i;
std::cin >> i;
}
重写(override)
重写也可以理解为覆盖,假如基类声明了一个虚函数,派生类中实现了不同的版本,这将会覆盖基类的版本,但如果特征标不匹配(例如参数不同),那么派生类中的函数就会被隐藏,无法被调用。但是编译器还是会正常编译,为了避免出现这种情况,可以在虚函数后面加上override标识符,告诉编译器你想要重写或覆盖基类的虚函数,编译器会帮你检查你的声明与基类是否一致。
#include <iostream>
class Base
{
public:
virtual void Print(int x) const
{
std::cout << x << std::endl;
}
};
class Balabala : public Base
{
public:
virtual void Print(int x) const override
{
std::cout << "Balabala:" << x * 2 << std::endl;
}
};
int main()
{
Balabala bala;
bala.Print(1);
int i;
std::cin >> i;
}
代码放git也有:https://github.com/xlonlat/cpp_notes.git
|