Tôi có đoạn mã sau:g ++ lỗi biên dịch "... được bảo vệ từ bên trong bối cảnh này", trong khi không có lỗi với kêu vang
#include <iostream>
class BaseClass {
protected:
static int x;
};
int BaseClass::x;
class DerivedA: public BaseClass {
public:
DerivedA() {
x = 3;
}
};
class DerivedB: public BaseClass {
public:
DerivedB() {
std::cout << DerivedA::x;
}
};
int main(int argc, char* argv[]) {
DerivedB b;
}
Biên soạn với g ++ (g++ classtest.cpp
) Tôi nhận được lỗi sau:
classtest.cpp: In constructor ‘DerivedB::DerivedB()’:
classtest.cpp:9:5: error: ‘int BaseClass::x’ is protected
int BaseClass::x;
^ classtest.cpp:25:32: error: within this context
std::cout << DerivedA::x;
Khi tôi biên dịch bằng tiếng kêu ++ (clang++ classtest.cpp
) không có lỗi.
Tại sao g ++ trả về lỗi biên dịch?
Tôi sử dụng phiên bản g ++ 5.1.0 và phiên bản clang ++ 3.6.1
Nó cũng biên dịch trong MVS2015 – Zereges
Tôi ngạc nhiên hơn rằng kêu vang ** không ** ném một lỗi ... Nhưng tôi có thể xác nhận, nó không phải. –
@DrewDormann Tại sao? Tôi ngạc nhiên bởi lỗi: mặc dù 'DerivedA ::', nó thực sự truy cập vào một thành viên được bảo vệ của 'BaseClass', từ một lớp có nguồn gốc từ' BaseClass'. – hvd