Đây là code:Tại sao một lớp dẫn xuất không truy cập một thành viên được bảo vệ của lớp cơ sở của nó thông qua một con trỏ tới cơ sở?
class TestA
{
protected:
int test=12;
public:
TestA() {
cout << "test a: " << test << endl;
}
~TestA() {
}
};
class TestB : public TestA
{
public:
TestB(TestA *testA) {
cout << "test b: " << testA->test;
}
~TestB() {
}
};
int main()
{
TestA *pTestA=new TestA();
TestB *pTestB=new TestB(pTestA);
}
Tôi đang cố gắng truy cập của một thành viên protected
sử dụng một con trỏ trỏ đến một đối tượng TestA
loại (do đó, một thể hiện của TestA
). TestB
cũng có nguồn gốc từ TestA
Tại sao tôi không thể truy cập vào nó? Chỉ có thể truy cập "bên trong" lớp mà tôi cần? Không phải bên ngoài bằng cách sử dụng con trỏ/khai báo trực tiếp?
Tôi mở lại câu hỏi này là câu trả lời đề cập ở đây là tốt hơn so với bản sao cũ: [truy cập vào một thành viên bảo vệ của một lớp cơ sở trong lớp con khác] (http: // stackoverflow.com/q/11631777/514235). Đóng cửa sổ còn lại. – iammilind
Câu trả lời ngắn gọn: Vì tiêu chuẩn cho biết điều này bị cấm. Theo đó, các trình biên dịch tuân thủ tiêu chuẩn sẽ ném một lỗi lên đó. YMMV, nhưng tôi thực sự gọi đây là lỗi trong tiêu chuẩn. – cmaster
@cmaster (Xem mã mẫu trong câu trả lời của tôi) Nếu được phép, có thể truy cập các thành viên được bảo vệ thông qua một con trỏ kiểu 'B *' trỏ đến một thể hiện 'D1' trong hàm thành viên của' D2'. Nhưng 'D1' và' D2' là không liên quan trong thực tế. Nó có vẻ phản trực giác. – songyuanyao