oop — В C ++ как мы можем вызывать приватную функцию через объект, не используя функцию друга?

Я наткнулся на этот код, написанный на 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.

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

5

Решение

Полиморфизм происходит в первом случае. Это вызывает динамическое или позднее связывание. И, как упоминалось во втором ответе, это может стать довольно опасным время от времени.

Вы не можете получить доступ к закрытому интерфейсу класса извне определения класса напрямую. Если вы хотите получить доступ к закрытой функции во втором экземпляре без использования функции друга, как следует из названия вашего вопроса, сделайте еще одну публичную функцию в вашем классе. Используйте эту функцию для вызова этой закрытой функции. Как это.

 int call_fun (int i) ;

Позвоните fun() изнутри

int call_fun (int i)
{
return fun (i) ;  //something of this sort, not too good
}

Такие функции, которые используются только для вызова другой функции, называются wrapper functions,

Изготовление friends Также не рекомендуется всегда. Это против принципа сокрытия информации.

3

Другие решения

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

4

По вопросам рекламы [email protected]