2010-11-01 46 views
5

Câu hỏi của tôi có lẽ sẽ được giải thích tốt nhất bằng một ví dụ.Gọi hàm bị ghi đè từ một lớp cơ sở?

Ví dụ, tôi có 2 lớp: Một lớp cơ sở và lớp dẫn xuất:

class baseClass 
{ 
public: 
    baseClass() 
    { 
     foo(); 
    } 
    virtual bool foo() { printf("baseClass"); return false;} 

}; 

class derivedClass : public baseClass 
{ 
public: 
    bool foo() 
    { 
     printf("derivedClass"); 
     return true; 
    } 

}; 

Khi tôi tạo ra một thể hiện của derivedClass, các nhà xây dựng trong baseClass sẽ được gọi, và foo() sẽ được gọi từ nó constructor. Vấn đề là, hàm tạo của baseClass đang gọi số foo() của chính nó và không có ghi đè nào là lớp bắt nguồn đã ghi đè. Có anyway để làm cho baseClass gọi chức năng ghi đè, không phải là định nghĩa riêng của nó về chức năng?

Trả lời

17

Bạn không nên gọi phương thức ảo từ một hàm tạo vì đối tượng chưa được xây dựng đầy đủ. Về cơ bản, lớp dẫn xuất không tồn tại, vì vậy các phương thức của nó không thể được gọi.

+0

+1: Constructors là đặc biệt và thủ thuật;) – James

+0

Cảm ơn bạn đã trả lời! Tôi cảm thấy như một thằng ngốc bây giờ bởi vì tôi nên biết điều này rồi. Cảm ơn:] – Brad

+2

Để biết cách thực hiện điều gì đó tương tự, hãy xem C++ FAQ Lite 23.6: http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6 – aschepler

0

Trong hầu hết các ngôn ngữ, hành vi này bị cấm hoặc không xác định, có lý do chính đáng.

Hãy xem xét điều này: hàm tạo lớp cơ sở được chạy trước hàm tạo lớp con, vì vậy mọi vars được định nghĩa bởi lớp con sẽ không được khởi tạo. Bạn có chắc chắn muốn gọi phương thức được phân lớp trong các trường hợp đó không?

Cách đơn giản nhất là định nghĩa phương thức initialize() trong lớp cha của bạn, sau đó chỉ cần nhớ gọi initialize() từ hàm tạo lớp con của bạn.

Các vấn đề liên quan