Хорошо ли определено перегруженное виртуальное поведение? - PullRequest
0 голосов
/ 26 января 2020

У меня есть код, похожий на приведенный ниже пример, в базе кода, над которой я работаю регулярно. Это вызывает «перегруженные виртуальные» предупреждения. Я не уверен, что задумал автор, и я не уверен, что реализация верна, или, может быть, это случайно? В любом случае, я хочу изменить это, чтобы более явно делать правильные вещи. Учитывая следующий пример ниже, что вы ожидаете напечатать, 11 или 12? Регулируется ли поведение в соответствии со стандартом и где я могу прочитать о нем подробнее?

class ABC {
public:
    virtual int test(double i) = 0;
    virtual int test(long i) = 0;
};

class BaseImpl : public ABC {
public:
    virtual int test(double i) {return static_cast<int>(i + 1);}
    virtual int test(long i) {return static_cast<int>(i + 1);}
};

class Derived : public BaseImpl {
public:
    int test(double i) {return static_cast<int>(i + 2);}
};


int main()
{
    auto* d = new Derived();
    ABC* b = dynamic_cast<ABC*>(d);
    long arg = 10;
    std::cout << d->test(arg) << "\n";
    std::cout << b->test(arg) << "\n";
}

1 Ответ

1 голос
/ 26 января 2020

Правильно ли определено перегруженное виртуальное поведение?

Да, поведение примера хорошо определено.

Принимая во внимание приведенный ниже пример, что делать вы ожидаете, что будет напечатано, 11 или 12?

Сначала ожидается правильный вывод: 12, а затем 11. Перегрузка, объявленная в Derived, скрывает все перегрузки из базовых областей.

Это может быть неочевидно, и кто-то может ожидать, что перегрузка long будет выбрана из базового класса таким образом, что выходные данные будут 11 и 11. Если это - предполагаемое поведение, то вам необходимо повторно объявить другие перегрузки в производном классе. Вот так:

class Derived : public BaseImpl {
public:
    using BaseImpl::test;
    int test(double i) {return static_cast<int>(i + 2);}

Является ли поведение, регулируемое стандартом

Да.

и где я могу узнать больше об этом ?

Официальным источником будет стандарт.

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