Это функция перегрузки или переопределения? - PullRequest
1 голос
/ 22 марта 2012

Это функция перегрузки или переопределения или что-то еще?(привет)

class A {

public:
    void hello(int x) { cout << "A" << endl; }

};

class B : public A {

public:
    void hello() { cout << "B" << endl; }

};

void main() {

    B obj;
    obj.hello();

}

Ответы [ 4 ]

9 голосов
/ 22 марта 2012

Это ни то, ни другое скрывает .

Объявление не виртуальной функции с тем же именем (даже если подпись отличается) в производном классе полностью скрывает реализацию базового класса.

Чтобы по-прежнему иметь доступ к A::hello, вы можете сделать следующее:

class B : public A {
public:
    using A::hello;
    void hello() { cout << "B" << endl; }
};

Перекрытие:

struct A
{
   virtual void foo() {}
};
struct B : public A
{
   /*virtual*/ void foo() {}
};

Перегрузка:

struct A
{
   void foo() {}
   void foo(int) {}
};
2 голосов
/ 22 марта 2012

Перекрытие:

struct Base {
    virtual void Foo() { std::cout << "Base\n"; };
};

struct Derived : Base {
    virtual void Foo() { std::cout << "Derived\n"; };
    // same name and signature as a virtual function in a base class,
    // therefore this overrides that function. 'virtual' is optional in
    // the derived class (but you should use it).
};

C ++ 11 добавляет способ обеспечить переопределение вашей функции:

struct Derived : Base {
    virtual void Foo() override { std::cout << "Derived\n"; };
};

Теперь, если метод Foo не переопределит что-то, вы получите ошибку.

struct Base {
   void Foo();
};

struct Derived : Base {
   virtual void Foo() override; // error, Derived::Foo is hiding Base::Foo, not overriding 
};
0 голосов
/ 25 апреля 2014

Это не перегруженная функция, поскольку в перегрузке функции число параметров или тип параметров должны различаться. Например:

void show(int a,int b);
void show(int a);
void show(char a,char b);

И это тоже не переопределение функций, потому что в переопределенном прототипе функции должны быть одинаковыми. Например: Базовый класс и производный класс, имеющий функцию void show(); //function prototype must be same

0 голосов
/ 22 марта 2012

Это ни то, ни другое.

Переопределение - это функция с той же сигнатурой (то же имя, параметры и возвращаемое значение) в подклассе.Перегрузка - это функция с тем же именем, но с другими параметрами.

...