Tôi nhầm lẫn về việc kiểm tra các bộ định danh truy cập tĩnh hoặc động. Người ta nói rằng truy cập specifiers không được kiểm tra động. Điều đó nghĩa là gì ?Cần hiểu câu lệnh "Khả năng truy cập được kiểm tra tĩnh và không tự động trong C++"
Ví dụ này được lấy từ posts khác nhau trên SO. Hãy xem xét ví dụ này
Ví dụ A:
class Base
{
public:
virtual void Message() = 0;
};
class Intermediate : public Base
{
//Is Message method virtual here too ? is it private or public ?
};
class Final : public Intermediate {
void Message() {
cout << "Hello World!" << endl;
}
};
Final final;
Bây giờ giả sử tôi làm điều gì đó như
Final* finalPtr = &final;
finalPtr->Message();
Công việc sẽ không ở trên này và sự hiểu biết của tôi là trong lớp học cuối cùng Phương pháp tin nhắn là tư nhân. Đúng không ? Nếu vậy tại sao điều này làm việc? phương thức trong
Intermediate* finalPtr = &final; // or Base* finalPtr = &final;
finalPtr->Message();
Lý do tại sao mã trên là làm việc vì con trỏ lớp cơ sở được khởi tạo với lớp dẫn xuất. Nếu vậy tại sao cuộc gọi đến Message() hoạt động. Các bài viết trên SO nói rằng kể từ khi thừa kế là công khai do đó nó sẽ được thừa hưởng như là chức năng công cộng? mặt khác, bản thân hàm trong lớp có đặc tả truy cập riêng (vì theo mặc định là hàm riêng của nó trong một lớp). Tôi bối rối ở đây và tôi sẽ đánh giá cao nếu ai đó có thể làm rõ điều này. Nó sẽ là chính xác để nói rằng nếu một lớp cơ sở được khởi tạo với một lớp dẫn xuất. Sau đó, các specifier truy cập của phương thức lớp cơ sở được ưu tiên hơn các specifier truy cập của lớp dẫn xuất?
Cập nhật:
Ngoài ra tôi nhận thấy rằng nếu tôi thay đổi mã Intermediate
và Final
như sau
class Intermediate : public Base
{
public: //Incase this public was absent then the following example wont work
void Message() {
cout << "Hello World! Intermediate" << endl;
}
};
class Final : public Intermediate {
void Message() {
cout << "Hello World! final" << endl;
}
};
và sử dụng nó như thế
Intermediate* i = new Final();
i->Message();
Sau đó inorder để có được đầu ra "Hello World! final"
nó là cần thiết để đánh dấu giao diện phương thức công khai. Tại sao vậy ? Phương thức Message
được kế thừa là công khai. Tại sao tôi cần phải đánh dấu nó là công khai ngay bây giờ?
Bạn nên liên kết các bài đăng khác. Bởi vì bạn đã không, bạn sẽ nhận được lời giải thích chính xác mà bạn không hiểu. –
chỉ cần thêm liên kết – Rajeshwar