Как сделать все скрытые имена из базового класса доступными в производном? - PullRequest
5 голосов
/ 15 января 2020

Исходя из этого вопроса:

И учитывая этот упрощенный код:

#include <string>
#include <iostream>

class Abstract
{
public:
    virtual void method(int a)
    {
        std::cout << __PRETTY_FUNCTION__ << "a: " << a << std::endl;
    }
};

class Concrete : public Abstract
{
public:
    void method(char c, std::string s)
    {
        std::cout << __PRETTY_FUNCTION__ << "c: " << c << "; s: " << s << std::endl;
    }
};

int main()
{
    Concrete c;
    c.method(42);    // error: no matching function for call to 'Concrete::method(int)'
    c.method('a', std::string("S1_1"));

    Abstract *ptr = &c;
    ptr->method(13);
    //ptr->method('b', std::string("string2"));    <- FAIL, this is not declared in Abstract.
}

У меня есть два сомнения. 1. Я знаю, что могу исправить ошибку, если «импортирую» имя method из Abstract с помощью

using Abstract::method;

, но затем импортирую все перегрузки этого имени. Можно ли импортировать только данную перегрузку? (Предположим, Abstract имеет более одной перегрузки, например:)

virtual void method(int a) = 0;
virtual void method(std::string s) = 0;
Можно ли импортировать все (публичные | защищенные | все) имена сразу из Abstract, не перечисляя их по одному?

(теперь предположим, что в дополнение к method, Abstract также имеет:)

virtual void foo() = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...