Как сделать так, чтобы частный член базового класса стал общедоступным членом дочернего класса? - PullRequest
2 голосов
/ 28 марта 2010

Рассмотрим следующий код:


class Base
{
    void f() { }
};

class Derived: public Base
{
public:

};

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


Derived d;
d.f();

Если член объявлен как открытый в базовом классе, добавление объявления использования для Base :: f в открытом разделе производного класса решило бы проблему. Но если он объявлен как частный в базовом классе, похоже, это не сработает.

Ответы [ 2 ]

5 голосов
/ 28 марта 2010

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

Единственный способ сделать из этого класса друга:

class Derived;

class Base
{
    void f() { }
    friend class Derived;
};

class Derived: public Base
{
public:
    using Base::f;
};

Поскольку вы все равно делаете имена общедоступными в производном классе, чтобы к ним могли обращаться производные классы Derived, вы можете сделать их protected в базовом классе и опустить объявление friend.

1 голос
/ 28 марта 2010

Вы не можете получить доступ к приватному члену из производного класса. Что вы можете сделать, так это сделать его защищенным и использовать объявление using:

class Base
{
protected:
    void f() { }
};

class Derived: public Base
{
public:
    using Base::f;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...