2009-10-10 17 views
5

Przykład tutaj nie ma sensu, ale w zasadzie to jest sposób, w jaki napisałem swój program w Pythonie, i teraz przepisuję go w C++. Wciąż próbuję uchwycić wiele dziedziczenia w C++, a to, co muszę zrobić, to uzyskać dostęp do A :: a_print od głównej instancji C. Poniżej zobaczysz, o czym mówię. czy to możliwe?Uzyskiwanie dostępu do członka/metody wirtualnej klasy pochodnej

#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(); 
} 

Oto błąd kompilacji.

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’ 

Odpowiedz

12

Niech B lub C odziedziczą po A używając "publicznego wirtualnego" zamiast "wirtualnego". W przeciwnym razie zakłada się, że jest dziedziczona prywatnie, a twoja funkcja main() nie będzie widzieć metod A.

+0

Bingo. To się stało. Dzięki. – Scott

+0

To jest dobry punkt: wystarczy, aby jedna z dwóch ścieżek dziedziczenia była jawna, aby umożliwić dostęp. Ścieżka jest tą, która zapewnia największy dostęp. –

Powiązane problemy