2009-10-10 35 views
5

El ejemplo aquí no tiene sentido, pero esto es básicamente cómo escribí mi programa en Python, y ahora estoy reescribiéndolo en C++. Todavía estoy tratando de comprender la herencia múltiple en C++, y lo que tengo que hacer aquí es acceder a A :: a_print desde main a través de la instancia de C. A continuación verás de lo que estoy hablando. es posible?Accediendo a un miembro/método de una clase derivada virtual

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

Aquí está el error de compilación.

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’ 

Respuesta

12

Haga que B o C hereden de A usando "público virtual" en lugar de solo "virtual". De lo contrario, se supone que se hereda de forma privada y su main() no verá los métodos de A.

+0

Bingo. Eso lo entendió Gracias. – Scott

+0

Ese es un buen punto: es suficiente para hacer pública una de las dos rutas de herencia para otorgar acceso. El camino tomado es el que proporciona el mayor acceso. –

Cuestiones relacionadas