2010-09-28 10 views
41

Supponiamo che io abbia una base e classe derivata:di default l'accesso di ereditarietà di classe

class Base 
{ 
    public: 
    virtual void Do(); 
} 

class Derived:Base 
{ 
    public: 
    virtual void Do(); 
} 

int main() 
{ 
    Derived sth; 
    sth.Do(); // calls Derived::Do OK 
    sth.Base::Do(); // ERROR; not calls Based::Do 
} 

come visto desidero accedere Base :: fare attraverso derivata. Ricevo un errore di compilazione come "classe Base inaccessibile" tuttavia quando dichiaro Derive come

class Derived: public Base 

funziona correttamente.

Ho letto l'accesso ereditario predefinito è pubblico, quindi perché ho bisogno di dichiarare esplicitamente l'ereditarietà pubblica qui?

risposta

30

Potresti aver letto qualcosa di incompleto o fuorviante. Per citare Bjarne Stroustrup da "The C++ programming Language", quarto Ed., P. 602:

In un class, i membri sono per impostazione predefinita private; in un struct, i membri sono per impostazione predefinita public (§16.2.4).

Questo vale anche per i membri ereditati senza identificatore del livello di accesso.

Una convenzione diffusa è, per utilizzare la struttura solo per l'organizzazione di membri di dati puri. È stato correttamente utilizzato un class per modellare e implementare il comportamento degli oggetti.

+0

@Prasoon estrapolate dal contesto hai ragione, ma il contesto stabilito dal titolo e dal codice è chiaramente "classe" e non "struttura". –

+1

Il downvote non è mio. In aumento per controbilanciare. :) –

9

Il livello di ereditarietà predefinito (in assenza di un identificatore di accesso per una classe base) per class in C++ è privato. [Per struct è pubblico]

class Derived:Base

Base è ereditata in privato, quindi non si può fare sth.Base::Do(); all'interno main() perché Base::Do() è privato all'interno Derived

97

Da documenti standard, 11.2.2

In assenza di un identificatore di accesso per una classe base, pubblico è assunto quando la classe derivata è definita con l' class-chiavestruct e privato è assunto quando la classe è definita con l'classe chiaveclasse.

Così, per struct s il valore predefinito è public e per class ES, il valore predefinito è private ...

Esempi dalle sé documenti standard,

class D3 : B {/.../}; // B private by default

struct D6 : B {/.../}; // B public by default

+22

Questa dovrebbe essere la risposta. – Eloff

+0

In secondo luogo. –

4

Il tipo predefinito dell'ereditarietà è privato. Nel codice,

Classe B: A

non è altro che

Classe B: Un privato

Problemi correlati