Доступ к перегруженному методу базового класса с тем же именем, что и у производного метода

Я пытаюсь вызвать метод из базового класса с тем же именем, что и метод в производном классе. Вот упрощенный пример:

#include <iostream>

using namespace std;

class Base
{
public:
    void print() {
        cout << "Printing from base" << endl;
    }

    void print(int num) {
        cout << "Printing number from base: " << num << endl;
    }
};

class Derived : public Base
{
    using Base::print;

public:
    void print() {
        cout << "Printing from derived" << endl;
    }
};


int main()
{
    Derived x;

    x.print();
    x.Base::print(1);

    //x.print(1); // Gives a compilation error

    return 0;
}

По сути, я хотел бы иметь возможность вызывать x.print(1) и получать "Печать номера из базы: 1", то есть автоматически вызывать метод, соответствующий сигнатуре, даже если он находится в базовом классе.

Без using Base::print;, Я получил error: no matching function for call to 'Derived::print(int)', что имеет смысл из-за сокрытия имени.

Таким образом, я добавил эту строку, но теперь ошибка error: 'void Base::print(int)' is inaccessible

Почему это так? Я использую публичное наследование, поэтому я бы подумал, что оно легко доступно?

Как показано в примере, он прекрасно работает, чтобы вручную вызвать x.Base::print(1);, но я бы хотел сделать это более прозрачно. Тогда, конечно, я могу повторно реализовать оболочку для функции в производном классе, но это тоже не выглядит очень элегантно.

Я прошу прощения, если это было рассмотрено в предыдущем вопросе, я прочитал несколько из них и нашел много подобных случаев, но ничего, что помогло мне.

2 ответа

Решение

Размещение директивы using определяет видимость. Просто поместите это в общественное место, и у вас все будет хорошо:

//...
class Derived : public Base
{

public:
    using Base::print;

    void print() {
        cout << "Printing from base" << endl;
    }
};
//...

http://ideone.com/06NNk

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

class base 
{
  public:
    virtual void Foo() {}
}

class Derived
{
}

Derived d;
d.foo(); // calls base::foo()
Другие вопросы по тегам