Показать определенную функцию с тем же именем и другой подписью из базового класса в производном - PullRequest
2 голосов
/ 28 февраля 2012
class Base
{
public:
    virtual void f(int)
    {
        printf("Base f(int)\n");
    }

    virtual void f(int, int)
    {
        printf("Base f(int, int)\n");
    }
};

class Der : public Base
{
public:
    using Base::f;

    virtual void f(double)
    {
        printf("Der f(double)\n");
    }
};

Так что в этом случае я могу использовать обе функции из базового класса.Но возможно ли разрешить использование в производном классе только определенного перегруженного метода из базы?Например, разрешите использовать только f (int), но не f (int, int).

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

Невозможно отобразить методы базового класса с помощью директивы using выборочно.К сожалению, это все или ничего.

3 голосов
/ 28 февраля 2012

Это будет делать:

class Der : public Base {
...
  virtual void f(int p) { return Base::f(p); }

Если производительность вас беспокоит, это приведет к статической отправке на void Base::f(int).

0 голосов
/ 26 февраля 2015

На самом деле можно скрыть только определенные элементы от базового класса, скрывая все, а затем снова скрывая только определенные (например, предоставляя закрытое переопределение):

struct Base
{
    void f(int) {
        printf("Base f(int)\n");
    }

    void f(int, int) {
        printf("Base f(int, int)\n");
    }
};

struct Der : Base
{
    using Base::f; // unhide all f's from Base

    void f(double) {
        printf("Der f(double)\n");
    }

// hide f(int, int) from Base by declaring it as private (no implementation needed)
private:
    void f(int, int); 
};

void Example() {
    Der der;
    der.f(1); // OK Base::f(int)
    der.f(1.0f); // OK Der::f(double)
    der.f(1,1); // compiler error: 'f' is a private member of 'Der'
}
...