2011-07-03 57 views
14

Tôi đang cố gắng để hoàn thành cùng được mô tả trong một câu hỏi trước:Gọi hàm ảo của lớp dẫn xuất từ ​​hàm tạo lớp cơ sở?

virtual function call from base class

Nhưng, câu hỏi thực sự của tôi là:

gì nếu f() là các nhà xây dựng trong lớp cơ sở ? G() nào sẽ được gọi? Tôi không biết nếu tôi làm sai, nhưng trong chương trình của tôi có vẻ như đó là điều ngược lại.

Lấy biến tương tự từ câu hỏi trước, một mã số trong đó cho thấy như vậy

hành vi sẽ trông như thế này:

Class Base 

{ 

    Base(){g();}; 

    virtual void g(){//Do some Base related code;} 

}; 



Class Derived : public Base 

{ 

    Derived(){}; 

    virtual void g(){//Do some Derived related code}; 

}; 



int main() 

{ 

    Derived newDerived; 

    return 0; 

} 

Cập nhật:

Thanx để Naveen.

Anh ấy đã cung cấp cho tôi trang chứa tất cả thông tin có liên quan về chủ đề này.

Tôi sẽ cho bạn biết liên kết ở đây:

parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6

+0

Bạn có thể hiển thị một số mã ví dụ thể hiện hành vi này không? – jtbandes

Trả lời

22

Mặc dù đó là một chức năng ảo, phiên bản cơ sở sẽ được gọi kể từ khi lớp dẫn xuất chưa được xây dựng đầy đủ. Trình tạo lớp cơ sở được gọi trước hàm tạo lớp dẫn xuất, vì vậy nếu hàm ảo có nguồn gốc được gọi, nó sẽ là một cá thể được khởi tạo không đầy đủ - một công thức có thể (có thể) cho thảm họa.

+0

Thanx. Lời giải thích này đã thuyết phục tôi. –

4

Nó sẽ Base::g(). Xem phần này FAQ để được giải thích.

1

Khi trình tạo lớp cơ sở của bạn được gọi, chỉ có vtable cho lớp cơ sở được thiết lập, vì vậy mọi cuộc gọi hàm ảo sẽ chỉ áp dụng cho các phương thức lớp cơ sở.

Khi hàm tạo của lớp dẫn xuất được gọi, gọi hàm ảo sẽ gọi ghi đè lớp dẫn xuất, nếu có.

1

Cơ chế ảo không hoạt động trong các hàm tạo, vì vậy nếu bạn gọi ngay cả hàm ảo từ hàm tạo lớp cơ sở, bạn sẽ luôn gọi các hàm của lớp cơ sở. Có một vài lý do tại sao các funcs ảo không hoạt động trong các ctors:

  1. Trong khi trong các nhà xây dựng, đối tượng chưa được tạo đầy đủ.
  2. cuộc gọi ctors chỉ được giải quyết lúc biên dịch, vì vậy chúng thực sự không có bất kỳ sự phụ thuộc thời gian chạy nào, do đó không sử dụng các chức năng ảo.
  3. Không giống như các chức năng khác, các ctors và dtors không được thừa hưởng, vì vậy mỗi lớp đều có bộ ctors và dtors riêng, vì vậy không có cơ hội ghi đè.
Các vấn đề liên quan