2009-10-14 4 views
21

이 기본 클래스 감안할 때 :파생 클래스 선언에 "Public"을 사용합니까?

class Manager : public Employee 
{ 
    EmployeeList employees; 

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

이 :

class Manager : Employee 
{ 
    EmployeeList employees; 

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

char *에 std :: string을 사용하고 std :: vector를 가리키는 포인터를 가리킨다. – GManNickG

+4

나는 동의하지 않는다. std :: string은 가변 길이 데이터를 허용하는 오버 헤드 계층을 추가합니다. 당신은 당신의 필요를 고려하고 현명하게 선택해야합니다. – sep

+2

컨텍스트에 대한 지식이 없으면 C- 배열 대신 'std :: vectors'를 사용하고 C- 문자열 대신 'std :: string'을 사용하는 것이 좋습니다. – AnT

답변

3

그 '대중'없이 "공개"와 관련하여

class Employee 
{ 
    char* name; 
    int age; 

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

을의이 사이의 차이점은 무엇입니까 'Employee'는 'Manager'의 개인 기본 클래스가됩니다.

'class'키워드로 선언 된 클래스는 기본적으로 비공개 멤버이며 기본 클래스는 private입니다.

키워드 'struct'로 선언 된 클래스는 기본적으로 멤버가 public이며 기본적으로 기본 클래스가 public입니다.

0

C++에서 상속은 기본적으로 비공개입니다. 그러나 Manager 클래스를 사용하는 모든 코드에는 동일한 메서드가 있으므로 거의 차이가없는 것처럼 보입니다.

Manager 개체를 Employee로 전송할 수는 없습니다. Manager 클래스 내에서 employees 변수에 액세스 할 수도 없습니다.

+0

C++의 기본 상속 유형은 클래스 선언에 사용 된 클래스 키에 따라 다릅니다. '클래스'- private, 'struct'- public. – AnT

+0

예, OP가 클래스를 사용 중이므로이 상황에서 true입니다. –

+2

예,이 컨텍스트에서. 그러나 "C++에서"아닙니다. "In C++"은 상당히 일반적인 상황을 제안합니다. – AnT

31

기본값은 개인 상속입니다. 이 예의 경우 :

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

은 개인 상속을 기본값으로 사용합니다.

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

만약 D 공개적 :이이 코드가 실패, D는 모든 보호와 공공 필드와 B는 (우리가 실제로 선언하는 경우)이 방법을 얻을 수 있지만, 따라서 B에 캐스팅 될 수 없음을 의미합니다 B에서 상속하면 D가 B로 형변환 될 수 있으며이 함수 호출은 문제가되지 않습니다.

두 번째 차이는

D.

의 모든 보호와 B의 public 멤버가 될 개인 회원이 실제로 무엇을 의미 하는가이다? 공개 상속은 D IS_A B를 의미하지만, 개인 상속은 "의 측면에서 구현 됨"을 의미합니다. B에서 D를 상속한다는 것은 B의 일부 기능을 활용하려고 함을 의미하지만 D IS_A B가 아니거나 B와 D 사이에 개념적 연결이 없기 때문에가 아닙니다. D

+1

환상적인 답변! –

+0

완벽 함 - 내가 뭘 찾고 있었는지! –

+0

감사합니다. 나 같은 사람은 이것을 처음 읽은 후 더 명확 해집니다. http://stackoverflow.com/a/1372858/1511337 –