2016-03-20 8 views
2

Anbetracht dieser Klasse:Kann eine abgeleitete Klasse auf eine private Methode einer geschützten inneren Klasse der übergeordneten Klasse zugreifen, die ein Freund der inneren Klasse ist?

class Matchable 
{ 
    protected: 
    class Match { 
     friend class Matchable; 

     void append(const Match& match) {} 
    }; 

    public: 
    virtual bool match(const Source& source) = 0; 
}; 

... wo die äußeren Klasse Matchable ein Freund der inneren Klasse ist Match, und unter Berücksichtigung dieser Klasse:

class Literal : public Matchable { 

    bool match(const Source& source) override { 
    Matchable::Match m; 
    Matchable::Match cm; 

    m.append(cm); 

    return true; 
    } 

} 

... wo Literal abgeleitet ist von Matchable, ich bin in der Lage, Matchable::Match in Literal::match() ohne Probleme zu instanziieren, aber ich bin nicht in der Lage, die private Methode Matchable::Match::append(), wo ich erwartet Literal erben die "f Freundlichkeit "von Matchable.

Ist dieses erwartete Verhalten und wenn ja, gibt es eine Möglichkeit, Literal Zugriff auf private Methoden der übergeordneten inneren Klasse Match?

+0

"Kann eine abgeleitete Klasse auf eine private Methode einer geschützten inneren Klasse der Elternklasse zugreifen, die ein Freund der inneren Klasse ist?" ... Nur wenn es Brawndo benutzt .. Es hat Elektrolyte! – txtechhelp

Antwort

2

Ja, dies ist das erwartete Verhalten. Siehe friend declaration

Freundschaft nicht vererbt wird (Ihr Freund der Kinder sind nicht deine Freunde)

Sie könnten eine delegierte Methode in Matchable bieten:

class Matchable 
{ 
    protected: 
    class Match { 
     friend class Matchable; 
     void append(const Match& match) {} 
    }; 
    void appendMatch(Match& match, const Match& matched) { 
     match.append(matched); 
    } 

    public: 
    virtual bool match(const Source& source) = 0; 
}; 

dann

class Literal : public Matchable { 

    bool match(const Source& source) override { 
    Matchable::Match m; 
    Matchable::Match cm; 

    appendMatch(m, cm); 

    return true; 
    } 

} 

Sonst könnten Siemachenpublic (die Freundschaftsdeklaration bedeutungslos machen).

+0

Direkt dran, danke! Sehen Sie, dass dies der Fall ist, ist Ihr Vorschlag eine häufig verwendete Lösung, oder missbrauche ich nur Freundesklassen auf diese Weise? Würden Sie zum Beispiel einen völlig anderen Ansatz vorschlagen, für das, was ich erreichen möchte? –

+0

@DecentDabbler Ich schlage vor, 'Match :: append' eine' public' Methode zu machen. Wenn man es "privat" macht und "Freund" benutzt, führt dies zu komplexem Code. Hast du einen besonderen Grund, es "privat" zu machen? – songyuanyao

+0

Ich würde es lieber nicht öffentlich machen, weil ich letztendlich die 'Match' -Instanz von der' match() '-Methode zurückgeben will (es wird in Zukunft ein zweites Argument zu' match() 'geben) und lass es "unveränderlich" für die Konsumenten von "match()" sein (wenn das Sinn macht). –

Verwandte Themen