我正在大学学习c plus plus课程,我无法区分功能的覆盖和重载,任何人都可以帮助我。
答案 0 :(得分:3)
以下是foo
的两个不同的重载:
void foo(int);
void foo(char);
此处B::bar
是一个功能覆盖:
class A {
public:
virtual void bar();
};
class B : public A {
public:
void bar() override;
};
答案 1 :(得分:1)
覆盖意味着,给出具有相同参数的现有函数的不同定义, 和重载意味着添加具有不同参数的现有函数的不同定义。
示例:
#include <iostream>
class base{
public:
virtual void show(){std::cout<<"I am base";} //this needs to be virtual to be overridden in derived class
void show(int x){std::cout<<"\nI am overloaded";} //this is overloaded function of the previous one
};
class derived:public base{
public:
void show(){std::cout<<"I am derived";} //the base version of this function is being overridden
};
int main(){
base* b;
derived d;
b=&d;
b->show(); //this will call the derived version
b->show(6); // this will call the base overloaded function
}
输出:
I am derived
I am overloaded
答案 2 :(得分:1)
重载意味着具有具有不同参数的名称的函数,它实际上并不依赖于您是否使用过程语言或面向对象语言来执行重载。就过度骑行而言,这意味着我们明确定义派生类中基类中存在的函数。显然,你需要面向对象的语言来执行过度,因为它是在基类和派生类之间完成的。
答案 3 :(得分:1)
重载意味着在同一范围内声明多个具有相同名称的函数。它们必须具有不同的参数类型,并且在编译时根据参数&#39;选择合适的重载。静态类型。
void f(int);
void f(double);
f(42); // selects the "int" overload
f(42.0); // selects the "double" overload
重写意味着派生类声明一个与基类中声明的虚函数匹配的函数。通过指针或对基类的引用来调用函数将根据对象的动态类型在运行时选择覆盖。
struct Base {
virtual void f();
};
struct Derived : Base {
void f() override; // overrides Base::f
};
Base * b = new Base; // dynamic type is Base
Base * d = new Derived; // dynamic type is Derived
b->f(); // selects Base::f
d->f(); // selects Derived::f