c ++ переопределить виртуальную функцию с параметром const вместо неконстантного параметра - PullRequest
5 голосов
/ 04 марта 2020

Когда я писал оверидную функцию с параметром const вместо неконстантного параметра, я думал, что компилятор сообщит об ошибке, потому что базовая функция имеет неконстантный параметр, но ей удалось его скомпилировать. Почему?

Мой код:

#include <iostream>

class A
{
public:
    virtual uint64_t cal(uint64_t value)
    {
        std::cout << value << std::endl;
        return value;
    }
};
class B : public A
{
public:
    uint64_t cal(const uint64_t value) override;
};
uint64_t B::cal(const uint64_t value)
{
  std::cout << value + 1 << std::endl; 
  return (value+1);
}
int main()
{
    B b;
    b.cal(1);
    return 0;
}

Ответы [ 3 ]

6 голосов
/ 04 марта 2020

Почему?

Поскольку в объявлении игнорируется верхний квалификатор const аргумента функции.

uint64_t cal(uint64_t value);

и

uint64_t cal(const uint64_t value);

объявить точно такой же тип функции. cal - это функция, принимающая uint64_t и возвращающая uint64_t. Квалификатор const не имеет значения для вызывающего кода, поскольку value всегда является копией переданного аргумента.

Единственное отличие заключается в теле функции, где * Квалификатор 1020 * не позволит вам изменить параметр. Но это деталь реализации.

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

. Лучше ли удалять «const» перед «примитивными» типами, используемыми в качестве параметров функции в заголовке?

5 голосов
/ 04 марта 2020

Обратите внимание, что cv-квалификаторы верхнего уровня отбрасываются при рассмотрении типа функции, поэтому uint64_t cal(uint64_t) и uint64_t cal(const uint64_t) рассматриваются как одинаковые тип функции .

(выделено мной)

Тип каждого параметра функции в списке параметров определяется в соответствии со следующими правилами:

4) Спецификаторы cv верхнего уровня удаляются из типа параметра (Эта настройка влияет только на тип функции, но не изменяет свойство параметра : int f(const int p, decltype(p)*); и int f(int, const int*); объявляют одну и ту же функцию)

3 голосов
/ 04 марта 2020

Верхний уровень const параметров не является частью сигнатуры функции. Единственное требование к перегрузке - совпадение подписей.

#include <type_traits>

int main()
{
  static_assert(std::is_same_v<int(int), int(const int)>);
}

Прекрасно компилируется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...