Рубрики

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

Мы обсуждали похожую тему на Java здесь . В отличие от Java, C ++ позволяет предоставлять более ограниченный доступ к методам производного класса. Например, следующая программа компилируется нормально.

#include<iostream>

using namespace std;

  

class Base {

public:

    virtual int fun(int i) { }

};

  

class Derived: public Base {

private:

    int fun(int x)   {  }

};

  

int main()

{  }

В приведенной выше программе, если мы изменим main () на следующее, получим ошибку компилятора, потому что fun () является закрытой в производном классе.

int main()

{

    Derived d;

    d.fun(1);

    return 0;

}

А как насчет программы ниже?

#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 

В приведенной выше программе частная функция Derived :: fun (int) вызывается через указатель базового класса, программа работает нормально, потому что fun () является общедоступной в базовом классе. Спецификаторы доступа проверяются во время компиляции, а fun () общедоступна в базовом классе. Во время выполнения вызывается только функция, соответствующая указанному объекту, и спецификатор доступа не проверяется. Таким образом, частная функция производного класса вызывается через указатель базового класса.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

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

0.00 (0%) 0 votes