2009-10-10 19 views
5

Buradaki örnek bir anlam ifade etmemektedir, ancak bu, programımı Python'da nasıl yazdım ve şimdi C++ ile yeniden yazdım. Ben hala C++ 'da birden fazla mirası kavramaya çalışıyorum ve burada yapmam gereken şey, A'dan başlayarak A'dan C'ye kadar olan bir dosyadır. Aşağıda, neden bahsettiğimi göreceksiniz. Mümkün mü?Sanal türetilmiş bir sınıfın bir üyesine/yöntemine erişme

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

İşte derleme hatası.

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’ 

cevap

12

B veya C, "sanal" yerine "genel sanal" kullanarak A'dan miras alır. Aksi takdirde, özel olarak devralındığı varsayılır ve ana() A'nın yöntemlerini görmez.

+0

Bingo. Bu aldı. Teşekkürler. – Scott

+0

Bu iyi bir nokta: Her iki miras yolunun da herkese erişim izni vermek için yeterli. Alınan yol, en fazla erişim sağlayan yoldur. –

İlgili konular