2009-10-10 44 views
5

Ví dụ ở đây không có ý nghĩa, nhưng về cơ bản tôi đã viết chương trình bằng Python như thế nào, và bây giờ tôi viết lại nó trong C++. Tôi vẫn cố gắng nắm bắt nhiều thừa kế trong C + +, và những gì tôi cần làm ở đây là truy cập A :: a_print từ chính thông qua thể hiện của C. Dưới đây bạn sẽ thấy những gì tôi đang nói về. Điều này có thể không?Truy cập vào một thành viên/phương thức của lớp dẫn xuất ảo

#include <iostream> 
using namespace std; 

class A { 
    public: 
    void a_print(const char *str) { cout << str << endl; } 
}; 

class B: virtual A { 
    public: 
    void b_print() { a_print("B"); } 
}; 

class C: virtual A, public B { 
    public: 
    void c_print() { a_print("C"); } 
}; 

int main() { 
    C c; 
    c.a_print("A"); // Doesn't work 
    c.b_print(); 
    c.c_print(); 
} 

Đây là lỗi biên dịch.

test.cpp: In function ‘int main()’: 
test.cpp:6: error: ‘void A::a_print(const char*)’ is inaccessible 
test.cpp:21: error: within this context 
test.cpp:21: error: ‘A’ is not an accessible base of ‘C’ 

Trả lời

12

Làm cho B hoặc C kế thừa từ A bằng cách sử dụng "ảo công cộng" thay vì chỉ "ảo". Nếu không, nó được giả định là được thừa kế riêng và chính của bạn() sẽ không thấy các phương thức của A.

+0

Bingo. Điều đó có nó. Cảm ơn. – Scott

+0

Đó là một điểm tốt: Đó là đủ để làm cho một trong hai con đường thừa kế công khai để cấp quyền truy cập. Con đường thực hiện là con đường cung cấp khả năng truy cập nhiều nhất. –

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