Я наткнулся на этот код, написанный на C ++:
#include<iostream>
using namespace std;
class Base {
public:
virtual int fun(int i) { cout << "Base::fun(int i) called"; }
};
class Derived: public Base {
private:
int fun(int x) { cout << "Derived::fun(int x) called"; }
};
int main()
{
Base *ptr = new Derived;
ptr->fun(10);
return 0;
}
Выход:
Derived::fun(int x) called
Пока в следующем случае:
#include<iostream>
using namespace std;
class Base {
public:
virtual int fun(int i) { }
};
class Derived: public Base {
private:
int fun(int x) { }
};
int main()
{
Derived d;
d.fun(1);
return 0;
}
Выход :
Compiler Error.
Кто-нибудь может объяснить, почему это происходит? В первом случае частная функция вызывается через объект.
Полиморфизм происходит в первом случае. Это вызывает динамическое или позднее связывание. И, как упоминалось во втором ответе, это может стать довольно опасным время от времени.
Вы не можете получить доступ к закрытому интерфейсу класса извне определения класса напрямую. Если вы хотите получить доступ к закрытой функции во втором экземпляре без использования функции друга, как следует из названия вашего вопроса, сделайте еще одну публичную функцию в вашем классе. Используйте эту функцию для вызова этой закрытой функции. Как это.
int call_fun (int i) ;
Позвоните fun()
изнутри
int call_fun (int i)
{
return fun (i) ; //something of this sort, not too good
}
Такие функции, которые используются только для вызова другой функции, называются wrapper functions
,
Изготовление friends
Также не рекомендуется всегда. Это против принципа сокрытия информации.
Потому что в первом случае вы используете объявление от Base
, который является публичным, и вызов в настоящее время привязан к Derived
реализация. Обратите внимание, что изменение спецификатора доступа в наследовании опасно и его почти всегда можно избежать.