sáchNgôn ngữ lập trình c++Có mã này:
lớp BB_ival_slider : Ival_slider công khai, BBslider được bảo vệ {
// ...
};
void f(BB_ival_slider* p)
{
Ival_slider* pi1 = p // OK
Ival_slider* pi2 = Dynamic_cast(p);
BBslider* pbb1 = p; // lỗi: BBslider là nền tảng được bảo vệ
BBslider* pbb2 = Dynamic_cast(p); // OK: pbb2 trở thành nullptr
}
Tôi đã cố gắng thể hiện hành vi này bằng đoạn mã sau để hiểu rõ hơn:
#include
lớp Ival_slider {
public:
Ival_slider() {
std::cout << "Ival_slider được gọi" << '\n';
}
};
lớp BBslider {
public:
BBslider() {
std::cout << "BBslider được gọi" << '\n';
}
};
lớp BB_ival_slider : Ival_slider công khai, BBslider được bảo vệ {
public:
BB_ival_slider() {
std::cout << "BB_ival_slider được gọi" << '\n';
}
};
int chính() {
BB_ival_slider* p = BB_ival_slider mới{};
Ival_slider* p1 = p;
Ival_slider* p2 = Dynamic_cast(p);
BBslider* pbb2 = Dynamic_cast(p);
nếu (pbb2) {
std::cout << "true" << '\n';
}
}
Nhưng,
BBslider* pbb2 = Dynamic_cast(p);
Có vẻ như không hoạt động như mong đợi.
g++ -std=c++11 -O0 -g3 -Wall -c -fmessage-length=0 -o cast.o "..\\cast.cpp"
..\cast.cpp: Trong hàm 'int main()':
..\cast.cpp:29:43: error: 'BBslider' là cơ sở không thể truy cập của 'BB_ival_slider'
BBslider* pbb2 = Dynamic_cast(p);
^
..\cast.cpp:29:43: error: 'BBslider' là cơ sở không thể truy cập của 'BB_ival_slider'
Tôi nghĩ Dynamic_cast ít nhất phải trả về nullptr. Cuốn sách có sai không? Tôi đang sử dụng GCC 4.9.2.
động_cast
ở đây vàtĩnh_cast
Không có gì khác biệt, trình biên dịch phát hiện ra rằng mã người dùng đang cố truy cập vào cơ sở được bảo vệ, điều này là bất hợp pháp. động_cast
Không có lỗi thời gian biên dịch nào bị ẩn hoặc bị trì hoãn. Nếu tại thời điểm biên dịch có thể xác định rằng việc truyền là bất hợp pháp thì trình biên dịch sẽ không bao giờ tạo bất kỳ mã nào và dựa vào bạn để kiểm tra trong thời gian chạy xem liệu việc truyền có thực sự không chính xác hay không.
Tôi là một lập trình viên xuất sắc, rất giỏi!