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

Как правило, мы хотим использовать частное наследование, чтобы скрыть детали реализации в базовом классе. Если это правда,

1) Почему функция публикации имени снова появилась? Это только для полноты языка или есть практическое применение?

2) Несмотря на то, что я публикую имя функции базового класса, производный класс все равно может объявить другую функцию с тем же именем. Пожалуйста, рассмотрите следующий код.

#include "iostream"
using namespace std;

class Base {
  public:
    int zoo;
    Base() {zoo =5;}
    int sleep() const {return 3;}
};

class Derived : Base { // Private inheritance
  public:
    using Base::zoo;
    using Base::sleep;
    int sleep() const { return 4.0; }
};

int main() {
    Derived der;
    der.sleep();
    cout<<" zoo is : "<<der.zoo<<endl;
    cout<<" Sleep is : "<<der.sleep()<<endl;
 }

В приведенном выше фрагменте, хотя мы публикуем имя, мы все равно можем объявить имя в производном классе и получить доступ к версии базовых классов переменных-членов. Как память управляется?

Спасибо.

1 ответ

Решение

http://en.cppreference.com/w/cpp/language/using_declaration

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

Эта ссылка содержит конкретные примеры того, что вы делаете, повторяет то, что я цитировал выше, и как базовый член просто скрыт производным членом.

Другие вопросы по тегам