je l'exemple de code suivant ne compile pas:héritage privé: Nom erreur de recherche
#include <stdio.h>
namespace my
{
class base1
{ // line 6
};
class base2: private base1
{
};
class derived: private base2
{
public:
// The following function just wants to print a pointer, nothing else!
void print(base1* pointer) {printf("%p\n", pointer);}
};
}
L'erreur qui imprime gcc est:
test.cpp:6: error: `class my::base1' is inaccessible
test.cpp:17: error: within this context
Maintenant, je peux deviner ce que le problème est: en regardant la déclaration de print
, le compilateur voit base1
et pense: base1
est le sous-objet de classe de base de derived* this
, mais vous n'avez pas accès! Alors que j'ai l'intention que base1
devrait être juste un nom de type. Comment puis-je voir dans la norme C++ que c'est un comportement correct, et pas un bogue dans le compilateur (je suis sûr que ce n'est pas un bug, tous les compilateurs que j'ai vérifiés se comportaient ainsi)?
Comment réparer cette erreur? Tous les correctifs suivants fonctionnent, mais lequel dois-je choisir?
void print(class base1* pointer) {}
void print(::my:: base1* pointer) {}
class base1; void print(base1* pointer) {}
Edit:
int main()
{
my::base1 object1;
my::derived object3;
object3.print(&object1);
}
Pouvez-vous poster la main()? –
Bon exemple montrant que l'héritage privé n'est pas du tout la même chose que la composition! – curiousguy