2009-10-14 9 views
21

Biorąc pod uwagę tę klasę bazową:Użycie "Public" w deklaracji klasy pochodnej?

class Employee 
{ 
    char* name; 
    int age; 

    public: 
    Employee(char* name); 
    void print(); 
}; 

w odniesieniu do "publiczny", co jest różnica między tym:

class Manager : public Employee 
{ 
    EmployeeList employees; 

    public: 
    Manager(char* name, Employee* people); 
    void print(); 
}; 

a to:

class Manager : Employee 
{ 
    EmployeeList employees; 

    public: 
    Manager(char* name, Employee* people); 
    void print(); 
}; 
+4

Użyj std :: string over char *, i std :: vector przez wskaźnik do tablicy. – GManNickG

+4

Nie zgadzam się. std :: string dodaje warstwę narzutów, aby umożliwić dane o zmiennej długości. Powinieneś rozważyć swoje potrzeby i mądrze wybierać. – sep

+2

Bez dobrej znajomości kontekstu, porady dotyczące używania "std :: vectors" zamiast C-array i "std :: string" zamiast C-stringów mają bardzo małą wartość, jeśli w ogóle. – AnT

Odpowiedz

3

Bez że 'publiczne' "Pracownik" stanie się prywatną klasą bazową "Menedżera".

Klasy zadeklarowane przy użyciu słowa kluczowego "klasa" mają domyślnie swoich członków i domyślnie ich klasy podstawowe są prywatne.

Klasy zadeklarowane za pomocą słowa kluczowego "struct" mają domyślnie swoich członków i domyślnie ich klasy podstawowe są publiczne.

0

W C++ dziedziczenie jest domyślnie prywatne. Jednak w przypadku dowolnego kodu za pomocą klasy Manager wydaje się, że prawie nie ma różnicy, ponieważ mają te same metody.

Nie można jednak rzutować obiektu Menedżera na pracownika. Nie będzie również można uzyskać dostępu do zmiennej employees z poziomu klasy Menedżer.

+0

Domyślny typ dziedziczenia w C++ zależy od klucza klasy używanego w deklaracji klasy. "klasa" - prywatna, "struktura" - publiczna. – AnT

+0

Tak, ale OP używa klasy, więc jest to prawdą w tym kontekście. –

+2

Tak, w tym kontekście. Ale nie "w C++". "W C++" sugeruje, moim zdaniem, znacznie bardziej ogólny kontekst. – AnT

31

Domyślnie jest to prywatne dziedziczenie. weź ten przykład:

class B { }; 
class D: B { }; 

domyślnie korzysta z prywatnego dziedziczenia. Oznacza to, że D dostaje wszystkie chronione i publicznych pól i metod, które B ma (jeśli faktycznie zadeklarowane w ogóle), ale nie może być oddane do B. W związku z tym, ten kod nie powiedzie się:

void foo(B* argument) {} 
foo(new D);     //not allowed 

Jeśli D publicznie dziedziczone z B, a następnie D może być rzutowany na B, a to wywołanie funkcji byłoby w porządku.

Drugą różnicą jest to, że wszystkie chronione i członków publicznych w B stają prywatne członków w D.

Co to właściwie znaczy? Dziedziczenie publiczne oznacza D IS_A B, ale prywatne dziedziczenie oznacza "jest zaimplementowane w kategoriach". Dziedziczenie D z B oznacza, że ​​chcesz skorzystać z niektórych funkcji w B, ale nie dlatego, że D IS_A B lub ponieważ istnieje jakieś konceptualne połączenie między B i D.: D

+1

Fantastyczna odpowiedź! –

+0

Idealnie - właśnie tego szukałem! –

+0

dzięki, dla innych takich jak ja, stanie się to wyraźniejsze po przeczytaniu tego pierwszego: http://stackoverflow.com/a/1372858/1511337 –

Powiązane problemy