2012-12-27 48 views
12

Hãy nói rằng tôi có các lớp sau:Gọi một phương pháp ghi đè từ lớp cơ sở

class A { 
public: 
    virtual void foo() { 
    bar(); 
    } 

protected: 
    virtual void bar() { 
    // Do stuff 
    } 
} 

class B : public A { 
protected: 
    virtual void bar() { 
    // Do other stuff 
    } 
} 

Nếu tôi có một thể hiện của B và gọi phương thức foo, phương pháp thanh sẽ được gọi là? Và trình biên dịch này có cụ thể không?

Cảm ơn

Trả lời

15

Các A::foo sẽ gọi B::bar nếu bạn có một thể hiện của B. Nó không quan trọng nếu dụ được tham chiếu thông qua một con trỏ hoặc tham chiếu đến một lớp cơ sở: bất kể điều này, B của phiên bản được gọi là; đây là điều làm cho các cuộc gọi đa hình có thể thực hiện được. Hành vi không phải là trình biên dịch cụ thể: các chức năng ảo hoạt động theo cách này theo tiêu chuẩn.

+7

Lưu ý rằng hành vi này không phải là trường hợp trong hàm khởi tạo cơ bản và hàm hủy. Ở đó nó sẽ gọi thực hiện cơ sở. Thảo luận: http://www.cplusplus.com/forum/general/109477/ –

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