覆盖和重载之间有什么区别?
“覆盖”和”重载”在C++面向对象编程中是两个非常重要的概念,它们的区别如下:
- 函数重载(Overloading):这发生在同一个类中,当你有两个或更多数量的函数拥有相同的名字但是参数列表不同(比如参数数量不同,参数类型不同,或者参数顺序不同)时,我们就称之为函数重载。例如:
class Example {
public:
void func(int a) { /*...*/ } // 第一个版本的func函数
void func(double a) { /*...*/ } // 第二个版本的func函数,参数是双精度浮点数
};
- 函数覆盖(Overriding):这发生在继承关系中,当子类有一个和父类完全相同的函数(函数名相同,参数列表相同,返回类型也相同),我们就称之为函数覆盖。子类覆盖父类的函数是为了提供不同的实现,这是多态性的一个重要体现。例如:
class Base {
public:
virtual void func() { /*...*/ } // 父类的func函数
};
class Derived : public Base {
public:
void func() override { /*...*/ } // 子类的func函数,覆盖了父类的func函数
};
在这个例子中,如果你有一个指向Derived类对象的Base类指针,并且通过这个指针调用func
函数,将会执行Derived类的func
函数,这就是多态性的体现。