Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 파생 클래스 메서드에 더 제한적인 액세스가 제공되면 어떻게 됩니까?


이 섹션에서는 C++에서 파생 클래스 메서드의 액세스를 제한하는 흥미로운 사실에 대해 논의합니다. 몇 가지 예를 보고 출력을 분석하여 C++에서 파생 클래스 메서드를 사용할 때의 제한 사항에 대해 자세히 알아보겠습니다.

예시(C++)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <iostream>
using namespace std;
class BaseClass {
public:
   virtual void display(){
      cout << "Print function from the base class" << endl;
   }
};
class DerivedClass: public BaseClass {
private:
   void display() {
      cout << "Print function from the derived class" << endl;
   }
};
int main() {
}

괜찮습니다. 이제 주요 기능 블록을 이것으로 바꾸면 아래와 같은 오류가 발생합니다. -

int main() {
   DerivedClass d;
   d.display();
}

출력

main.cpp: In function ‘int main()’:
main.cpp:20:15: error: ‘virtual void DerivedClass::display()’ is private
within this context
d.display();
^
main.cpp:13:10: note: declared private here
void display() {
^~~~~~~

파생 클래스의 메서드가 private이므로 오류가 표시됩니다. 이제 기본 포인터를 사용하여 함수가 호출되는 이 구현을 살펴보겠습니다. 이것은 함수를 호출할 수 있습니다.

예시(C++)

#include <iostream>
using namespace std;
class BaseClass {
public:
   virtual void display(){
      cout << "Print function from the base class" << endl;
   }
};
class DerivedClass: public BaseClass {
private:
   void display() {
      cout << "Print function from the derived class" << endl;
   }
};
int main() {
   BaseClass *b = new DerivedClass;
   b->display();
}

출력

Print function from the derived class

위의 프로그램에서 우리는 개인 함수 DerivedClass::display()가 기본 클래스 포인터를 통해 호출되고 있음을 알 수 있습니다. display() 함수가 기본 클래스에서 공용이므로 프로그램이 제대로 작동합니다. 액세스 지정자는 컴파일 시간에 확인되고 display()는 기본 클래스에서 공개됩니다. 런타임 중에는 가리키는 개체에 해당하는 함수만 호출되고 액세스 지정자는 확인되지 않습니다. 따라서 파생 클래스의 private 함수는 기본 클래스의 포인터를 통해 호출됩니다.