Доступ к перегруженному методу базового класса с тем же именем, что и у производного метода
Я пытаюсь вызвать метод из базового класса с тем же именем, что и метод в производном классе. Вот упрощенный пример:
#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;
}
};
//...
Вы можете сделать свои функции виртуальными. Любые виртуальные функции, унаследованные от базового класса, которые не перегружены, будут вызываться через производный класс.
class base
{
public:
virtual void Foo() {}
}
class Derived
{
}
Derived d;
d.foo(); // calls base::foo()