Tôi có một câu hỏi về việc khởi tạo các thành viên kế thừa trong hàm tạo của lớp dẫn xuất. mã ví dụ:C++: Khởi tạo trường kế thừa
class A
{
public:
int m_int;
};
class B: public A
{
public:
B():m_int(0){}
};
Mã này mang lại cho tôi kết quả như sau:
In constructor 'B::B()': Line 10: error: class 'B' does not have any field named 'm_int'
(thấy http://codepad.org/tn1weFFP)
Tôi đoán lý do tại sao điều này xảy ra? m_int
nên thành viên của B
, và tầng lớp phụ huynh A
nên đã được khởi tạo khi khởi tạo của m_int
trong B
xảy ra (vì nhà xây dựng mẹ chạy trước khi khởi tạo thành viên của lớp được thừa kế). Đâu là một sai lầm trong lý luận của tôi? Điều gì thực sự xảy ra trong mã này?
EDIT
: Tôi biết các khả năng khác để khởi tạo thành viên này (hàm tạo cơ sở hoặc gán trong hàm khởi tạo), nhưng tôi muốn hiểu tại sao nó lại bất hợp pháp theo cách tôi thử? Một số tính năng ngôn ngữ C++ cụ thể hoặc như vậy? Vui lòng chỉ cho tôi một đoạn trong tiêu chuẩn C++ nếu có thể.
Đây là câu trả lời hay nhưng tôi chỉ muốn thêm một số giải thích. Khi bạn sử dụng toán tử:, bạn đang nói với trình biên dịch rằng trước khi nó thực hiện bất cứ điều gì khác, nó sẽ chạy các hướng dẫn này. Về cơ bản bạn đang thiết lập một biến trước khi constructor cha (hoặc bất cứ điều gì khác) đã chạy. Do đó biến không tồn tại. : A(), m_int (0) cũng sẽ hoạt động.Theo mặc định, nếu bạn không sử dụng:, trình biên dịch sẽ chạy hàm tạo của lớp cơ sở. Nói cách khác, nếu bạn không làm gì thì C++ sẽ làm những thứ mặc định cho bạn, nếu bạn bắt đầu chỉ định mọi thứ, nó sẽ cho bạn biết bạn đang làm gì. –
Hmmm ... Theo như tôi biết hàm tạo của lớp cha luôn luôn chạy trước bất kỳ khởi tạo nào khác và do đó biến 'm_int' đã tồn tại khi tôi đang cố gắng khởi tạo nó. Vì vậy, đây không phải là vấn đề ... – Haspemulator
@ Haspemulator Vâng, nó đã tồn tại nhưng đó là lý do tại sao bạn nhận được lỗi. Nó đã được khởi tạo mặc định bởi hàm tạo của A. Bạn không thể khởi tạo lại một biến trong hàm tạo của B. Bạn có thể chỉ định lại như Ben Jackson nêu trên ('m_int = 0') và đó là về nó tại thời điểm đó. – wheaties