переопределение виртуальной функции скрывает другие перегруженные функции с тем же именем от другого базового класса - PullRequest
4 голосов
/ 16 сентября 2010

Хорошо, я использую виртуальные функции, перегруженные функции и множественное наследование.Конечно, это не очень хорошо.

Сценарий: класс base1 имеет виртуальную функцию, которая должна быть указана его дочерним элементом.Класс derived происходит от двух родителей base1 и base2 и должен использовать существующую функциональность base2 для определения виртуальной функции base1.

Это нормально, но неудобно, конечно,Мотивация заключается в том, что я не могу изменить класс base2, и существующий интерфейс, в который уже вложены значительные средства, имеет функции классов base1 и base2 с тем же именем.Это нормально, в base1 ничего не реализовано, нужно просто перенаправить на base2.

Моя проблема возникает из-за того, что base2 имеет несколько перегруженных функций с тем же именем, что и рассматриваемая виртуальная функция.Все остальные перегруженные версии становятся по существу скрытыми во время компиляции.

Вот небольшой демонстрационный код.

// this version does not compile, overloaded samenameFunc(int, int) cannot be found in the derived class.
#include <iostream>
using namespace std;

class base1 {
public:
    virtual void samenameFunc(int scratch) { cout << "from base1: " << scratch << std::endl; }
};

class base2 {
public:
    void samenameFunc(int scratch) { cout << "samenameFunc from base2: " << scratch << std::endl; }
    void samenameFunc(int scratch, int foo)  { cout << "samenameFunc(2 args) from base2: " << scratch << ", " << foo << std::endl; }
};

class derived : public base1, public base2 {
public:
    void samenameFunc(int scratch) { base2::samenameFunc(scratch); }// { cout << "from derived: " << scratch << std::endl; }
};

int main()
{
    derived d;

    d.samenameFunc(66);
    d.samenameFunc(77, 88);
    return 0;
}

И ошибки компилятора:

$ g++ inheritance_overload_tester.cc 
inheritance_overload_tester.cc: In function ‘int main()’:
inheritance_overload_tester.cc:26: error: no matching function for call to ‘derived::samenameFunc(int, int)’
inheritance_overload_tester.cc:18: note: candidates are: virtual void derived::samenameFunc(int)

ЕслиПерегружен samenameFunc(int, int) переименован, я могу скомпилировать и функционировать, как ожидалось.Но помните, я не могу изменить base2.

// this version does compile
#include <iostream>
using namespace std;

class base1 {
public:
    virtual void samenameFunc(int scratch) { cout << "from base1: " << scratch << std::endl; }
};

class base2 {
public:
    void samenameFunc(int scratch) { cout << "samenameFunc from base2: " << scratch << std::endl; }
    void anotherFunc(int scratch, int foo)  { cout << "anotherFunc(2 args) from base2: " << scratch << ", " << foo << std::endl; }
};

class derived : public base1, public base2 {
public:
    void samenameFunc(int scratch) { base2::samenameFunc(scratch); }// { cout << "from derived: " << scratch << std::endl; }
};

int main()
{
    derived d;

    d.samenameFunc(66);
    d.anotherFunc(77, 88);
    return 0;
}

Если это невозможно исправить в существующей презентации, может ли кто-нибудь предложить другую модель наследования объектов для решения моей проблемы?

1 Ответ

5 голосов
/ 16 сентября 2010

В определении класса derived вы можете добавить объявление использования, чтобы сделать функцию из base2 видимой:

using base2::samenameFunc;
...