2013-01-31 13 views
7

thể trùng lặp:
Calling virtual functions inside constructorsC++ phương pháp ảo trọng

main.cpp

#include <iostream> 

class BaseClass { 

    public: 

    BaseClass() { 
     init(); 
    } 

    virtual ~BaseClass() { 
     deinit(); 
    } 

    virtual void init() { 
     std::cout << "BaseClass::init()\n"; 
    } 

    virtual void deinit() { 
     std::cout << "BaseClass::deinit()\n"; 
    } 

}; 

class SubClass : public BaseClass { 

    public: 

    virtual void init() { 
     std::cout << "SubClass::init()\n"; 
    } 

    virtual void deinit() { 
     std::cout << "SubClass::deinit()\n"; 
    } 

}; 

int main() { 
    SubClass* cls = new SubClass; 
    delete cls; 
    return 0; 
} 

Tại sao init()deinit() không overriden đúng cách và phương pháp của BaseClasses ar e được gọi thay vì các SubClasses? Các yêu cầu để làm cho nó hoạt động là gì?

BaseClass::init() 
BaseClass::deinit() 
+0

@LightnessRacesinOrbit: Xin lỗi vì điều đó. Tôi đã không trực tiếp liên kết vấn đề với các nhà xây dựng và destructor, mà tôi đoán là lý do tại sao tôi đã không tìm thấy câu hỏi này. –

+0

Tôi đoán rằng sự biện minh là phương thức khởi tạo 'SubClass' được cho phép giả định rằng' BaseClass' được xây dựng hoàn toàn khi nó đang thi hành. Tương tự cho destructor. –

Trả lời

5

Vì bạn đang gọi một phương thức ảo bên trong một hàm tạo. Trong khi xây dựng lớp Cơ sở thì lớp cơ sở (SubClass) vẫn chưa được xây dựng, vì vậy thực tế nó không tồn tại.

Thông thường, thực tiễn tốt là tránh gọi các phương thức ảo bên trong các nhà thầu.

5

Chúng bị ghi đè tốt.

Nhưng bạn đã gọi họ từ các nhà xây dựng cơ sở , và khi các nhà xây dựng cơ sở được thực hiện, các có nguồn gốc phần của đối tượng chưa tồn tại.

Vì vậy, đây là một tính năng an toàn phần lớn và được yêu cầu bởi tiêu chuẩn C++.