Computer >> Máy Tính >  >> Lập trình >> C ++

Điều gì sẽ xảy ra khi quyền truy cập hạn chế hơn được cấp cho một phương thức lớp dẫn xuất trong C ++


Trong phần này, chúng ta sẽ thảo luận về các sự kiện thú vị hạn chế quyền truy cập của các phương thức lớp dẫn xuất trong C ++. Chúng ta sẽ xem một số ví dụ và phân tích kết quả đầu ra để biết thêm về các hạn chế của việc sử dụng các phương thức lớp dẫn xuất trong C ++.

Ví dụ (C ++)

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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() {
}

Điều này là tốt, bây giờ nếu chúng ta thay thế khối chức năng chính bằng khối này, chúng ta sẽ gặp lỗi như bên dưới -

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

Đầu ra

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() {
^~~~~~~

Nó hiển thị lỗi vì phương thức trong lớp dẫn xuất là riêng tư. Bây giờ chúng ta hãy xem việc triển khai này, trong đó hàm được gọi bằng cách sử dụng con trỏ cơ sở. Điều này có thể gọi hàm.

Ví dụ (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();
}

Đầu ra

Print function from the derived class

Từ chương trình trên, chúng ta có thể thấy rằng hàm private DerivedClass ::display () đang được gọi thông qua con trỏ lớp cơ sở, chương trình hoạt động tốt vì hàm display () là public trong lớp cơ sở. Các chỉ định truy cập được xác minh tại thời điểm biên dịch và display () là công khai trong lớp cơ sở. Trong thời gian chạy, chỉ hàm tương ứng với đối tượng trỏ được gọi và chỉ định truy cập không được xác minh. Vì vậy, một hàm riêng của lớp dẫn xuất đang được gọi thông qua một con trỏ của lớp cơ sở.