переопределение метода const базового класса из производного класса - PullRequest
0 голосов
/ 25 марта 2012

class Base{
//...
    public:
    int get()const{ // const
    // Do something.
     }
    int get(int x){
    // Do Someting.
     }

    //...

};
class Derived:public Base{
//....
     public:
     int get(){ // not const (not the same signature as the one is the base class) 
     //Dosomething
     }
      //...

};

Я знаю, что get () в классе Derived будет скрывать методы get () и get (int x) внутри базового класса. поэтому мой вопрос:
1) это перегрузка или переопределение?
2) делает, что get () const в производном классе что-то изменит (скрывает или не скрывает методы базового класса).

Цитата из книги на c ++:

"Распространенной ошибкой является скрытие метода базового класса, когда вы собираетесь его переопределить, путем забыв включить ключевое слово const. const является частью подписи, и оставляя ее изменяет подпись и, таким образом, скрывает метод, а не переопределяет его. «

Ответы [ 3 ]

7 голосов
/ 25 марта 2012

Это не перегрузка и не переопределение. Скорее, это скрывается .

Если бы была видна и другая функция, она была бы перегрузкой, чего можно достичь с помощью using:

class Derived  : public Base
{
public:
    using Base::get;
    int get();
};

Даже если вы объявите int get() const в производном классе, он будет просто скрывать базовую функцию, поскольку базовая функция не является virtual.

2 голосов
/ 25 марта 2012

Перегрузка - это функция с таким же именем, но с другой подписью.

Переопределение - это переопределение уже существующей подписи.

Вы только что «спрятались», чего нет.

Быстрый поиск в Google показывает это: http://users.soe.ucsc.edu/~charlie/book/notes/chap7/sld012.htm, что может оказаться полезным.

2 голосов
/ 25 марта 2012
  1. Ни то, ни другое, оно просто "прячется".

  2. Нет.Скрытие происходит на основе имени функции, а не сигнатуры функции.

Ваша цитата актуальна только в том случае, если вы объявили функции базового класса virtual;Вы не можете переопределить не-virtual функцию.

...