2012-08-29 46 views
8

tôi có:C++: Làm thế nào để gọi một hàm tầng lớp phụ huynh từ bên ngoài

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

class B : public A{ 
    public: 
     void foo(); 
}; 

B *ptr = new B(); 

Tôi muốn gọi của một foo() TRỰC TIẾP sử dụng 'ptr' con trỏ.

Khi tôi cố gắng

(A*)ptr->foo(); 

nó vẫn gọi phiên bản của foo() B. Làm cách nào để gọi phiên bản của A?

Điều này có khả thi không? Các lựa chọn thay thế là gì? Cảm ơn bạn.

+0

Hãy xem http://en.wikipedia.org/wiki/Scope_resolution_operator – Pramod

+0

Bạn có thể làm rõ ý của mình bằng cách "không hoạt động" không? Điều gì xảy ra chính xác khi bạn thử mã trên? –

+3

Làm điều này hoàn toàn đánh bại mục đích của việc tạo ra một hàm ảo, vì vậy nó có nghĩa là người dùng của lớp 'A' đang trốn tránh ý định của nhà thiết kế lớp. Điều này có thể có nghĩa là có lỗi thiết kế ở đâu đó: hoặc 'A' không cung cấp tất cả các chức năng cần thiết, hoặc người dùng' A' không hiểu cái gì 'A' được cho là phải làm. –

Trả lời

18

Khi bạn đặt tên cho hàm bằng mẫu có độ phân giải phạm vi ::, bạn gọi hàm được đặt tên, như thể nó không phải là ảo.

ptr->A::foo(); 
+3

+1. Đó là chính xác, mặc dù nó sẽ là tốt hơn nếu bạn cũng nói về vấn đề tiếp cận trong mã của OP. – Nawaz

+3

@Nawaz: Và thậm chí tốt hơn nếu thực tế là điều này phá vỡ tất cả các nguyên tắc OO cũng đã được đề cập :) Người dùng 'B' không nên quan tâm phiên bản của' foo' được gọi, đó là điểm chính của đa hình. –

2

Bạn cần đặt chức năng của mình ở chế độ công khai. Bạn làm điều này chỉ đơn giản bằng cách thay đổi sau đây:

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

class B : public A{ 
    public: 
     void foo(); 
}; 

Khi bạn không làm được điều này, các chức năng sẽ được tự động tư nhân và không thể tiếp cận từ "bên ngoài".

+0

Chúng là công khai, tôi không chỉ rõ điều đó trong ví dụ. – nahpr

+4

@nahpr Để tham khảo trong tương lai, tôi khuyên bạn nên thực hiện một nỗ lực không cần thiết để không đưa thêm lỗi vào mã mà bạn đăng ở đây. Điều này sẽ giúp tránh lãng phí thời gian của bạn phân loại thông qua câu trả lời vô ích. –

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