一、重载、重写与重定义的概念
C++中,重载、重写和重定义是三个与函数和类成员相关的概念,但它们具有不同的含义和用途。
重载:是指在同一作用域内,可以有多个名称相同但参数列表(参数类型、参数个数或参数顺序)不同的函数或成员函数。这些函数可以是普通的函数,也可以是类的成员函数。通过函数重载,我们可以使用相同的函数名来执行不同的任务,这取决于传递给函数的参数类型和数量。
在C++中,一个类可以有多个构造函数,只要它们的参数列表不同即可。这种情况下,我们可以说这些构造函数是重载的。
class MyClass
{
public:
// 无参构造函数
MyClass() {
// ...
}
// 带一个整型参数的构造函数
MyClass(int value) {
// ...
}
// 带一个浮点型参数的构造函数
MyClass(double value) {
// ...
}
// 带两个参数的构造函数
MyClass(int a, double b) {
// ...
}
};
重定义(隐藏):也称为重复定义或重复声明,通常指的是在相同的作用域内多次定义同一个函数或变量,这会导致编译错误。但是,在类继承的上下文中,当我们说“重定义”时,可能是指派生类中对基类成员变量的重新声明,或者对基类非虚成员函数的重新声明,因为它会隐藏基类中的成员。
class A
{
public:
void fun()
{
cout << "func()" << endl;
}
};
class B : public A
{
public:
void fun(int i)
{
A::fun();
cout << "func(int i)->" << i << endl;
}
};
void Test()
{
B b;
b.fun(10);
};
重写(覆盖):特指在派生类中定义与基类虚函数同名、同参数列表(包括参数类型、参数个数和参数顺序)的函数。重写用于实现基类和派生类之间的多态性。当通过基类指针或引用来调用一个虚函数时,如果指针或引用指向的是派生类对象,那么将调用派生类中重写的虚函数,而不是基类中的函数。这允许派生类为基类中的虚函数提供自己的实现。
class Base {
public:
virtual void func1() { cout << "Base::func1" << endl; }
virtual void func2() { cout << "Base::func2" << endl; }
private:
int a;
};
class Derive :public Base {
public:
virtual void func1() { cout << "Derive::func1" << endl; }
virtual void func3() { cout << "Derive::func3" << endl; }
virtual void func4() { cout << "Derive::func4" << endl; }
private:
int b;
};