cuốn sách gpt4 ai đã làm

Upcast lên cơ sở được bảo vệ bằng cách sử dụng Dynamic_cast

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 13:36:18 27 4
mua khóa gpt4 Nike

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.

câu trả lời hay nhất

động_castở đây vàtĩnh_castKhô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.

Về C++ - nâng cấp lên cơ sở được bảo vệ bằng Dynamic_cast, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/29443650/

27 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress