public 상속과 private 상속의 차이점?
      글쓴이: nayana / 작성시간: 월, 2004/10/18 - 5:10오후    
  
  문법책을 보다가 의문점이 생겨서 질문을 드립니다.
다름아니라...
A class, B class 있다고 했을 때...
A class 가 기반 클래스 B class 가 파생 클래스 일때...class B : public A 
일때 B클래스에서 protected는 A class에 protected, public 멤버에 접근할수 있고 외부에서는 A class의  public , B class의  public에 접근 할수 있고class B: private A   
일때 B클래스에서 protected는 A class에 protected, public 멤버에 접근할
수 있고 외부에서는 A class의 public에 접근할수없고 B class의 public에 접근할수가 있다고 나옵니다.그래서 나름대로 시험을 해볼려고 실험을 해봤습니다.
a.h
     1 #ifndef __A_H__
      2 #define __A_H__
      3
      4 class A
      5 {
      6 public :
      7     A();
      8     virtual ~A();
      9     void Init();
     10
     11 protected :
     12     void Init1();
     13
     14 private :
     15     void Init2();
     16 };
     17
     18 #endifa.cpp
      1 #include "a.h"
      2 #include <cstdio>
      3
      4 A::A()
      5 {
      6 }
      7
      8 A::~A()
      9 {
     10
     11 }
     12
     13 void A::Init()
     14 {
     15     printf( "A public\n" );
     16 }
     17
     18 void A::Init1()
     19 {
     20     printf( "A protected\n" );
     21 }
     22
     23 void A::Init2()
     24 {
     25     printf( "A private\n" );
     26 }b.h
      1 #ifndef __B_H__
      2 #define __B_H__
      3
      4 #include "a.h"
      5
      6 class B: private A
      7 {
      8 public :
      9     B();
     10     virtual ~B();
     11     void bInit();
     12
     13 protected:
     14     void bInit1();
     15
     16 private:
     17     void bInit2();
     18 };
     19
     20 #endifb.cpp
      1 #include "b.h"
      2 #include <cstdio>
      3
      4 B::B()
      5 {
      6
      7 }
      8
      9 B::~B()
     10 {
     11 }
     12
     13 void B::bInit()
     14 {
     15     printf( "B public\n" );
     16     bInit1();
     17 }
     18
     19 void B::bInit1()
     20 {
     21     A::Init(); // 접근 가능
     22     A::Init1(); // 접근 가능
     23     printf( "B protected\n" );
     24 }
     25
     26 void B::bInit2()
     27 {
     28     printf( "B private\n" );
     29 }c.h
     1 #ifndef __C_H__
      2 #define __C_H__
      3
      4 #include "a.h"
      5
      6 class C
      7 {
      8 public :
      9     C();
     10     ~C();
     11     void cInit();
     12 protected :
     13     void cInit1();
     14 private :
     15     void cInit2();
     16     A a;
     17 };
     18
     19 #endifc.cpp
      1 #include "c.h"
      2 #include <cstdio>
      3
      4 C::C()
      5 {
      6
      7 }
      8
      9 C::~C()
     10 {
     11
     12 }
     13
     14 void C::cInit()
     15 {
     16     a.Init(); // 이론대로 하면 여기서 접근 불가능이라고 나와야 하는데..접근 가능합니다.
     17     printf( "C public\n" );
     18 }
     19
     20 void C::cInit1()
     21 {
     22     printf( "C protected\n" );
     23 }
     24
     25 void C::cInit2()
     26 {
     27     printf( "C private\n" );
     28 }main.cpp
         1 #include "b.h"
      2 #include "c.h"
      3
      4 int main( void )
      5 {
      6     B b;
      7     C c;
      8
      9     b.bInit();
     10     c.cInit();
     11
     12     return 0;
     13 }외부( C class ) 에서 A class의 public 에 외부접근 되는데...책이 잘못된건 가요...아니면...제가 상속에 대해서 잘못 이해하고 있는건가요? 아무래도 제가 잘못이해하고 있는것 같은데....^^
Forums: 


이그.. 의도하지 않게 클래스를 재정의 해버렸네요...B, C 클래스
이그.. 의도하지 않게 클래스를 재정의 해버렸네요...
B, C 클래스 멤버함수가 없으면 A 클래스 멤버를 상속받게 되지요..
C 클래스는 A 클래스를 포함하고 있습니다. C 클래스는 A 클래스를 상
C 클래스는 A 클래스를 포함하고 있습니다. C 클래스는 A 클래스를 상속한게 아니므로, C 에서 A 를 포함하면 C 멤버안에서는 A 의 public 멤버를 사용할 수 있습니다.
상속과 포함을 잠깐 혼동하신 듯 합니다.
아마 C 클래스에 B 클래스를 포함하고 B 를 통한 A 멤버의 접근이 안되는 경우를 말씀하시려고 하신 것 같습니다.
public, private 상속은 그 성격이 판이하게 다르기 때문에 꼭 좋은 텍스트를 참고하시면 좋겠습니다.
헤깔리고 계시네요.C와 A는 아무 상속관계없고 클래스 C에서
헤깔리고 계시네요.
C와 A는 아무 상속관계없고 클래스 C에서 private member의 public member함수를 호출하고 있으니 아무 문제 없습니다.
TC++PL에 아주 자세히 잘 설명 되어 있습니다.
Life rushes on, we are distracted
일단 답변에 감사드립니다.[code:1]아마 C 클래스에 B 클래스를
일단 답변에 감사드립니다.
아마 C 클래스에 B 클래스를 포함하고 B 를 통한 A 멤버의 접근이 안되는 경우를 말씀하시려고 하신 것 같습니다님의 말씀대로 c.h 파일에 B class 인스턴스 b 를 선언하고
14 void C::cInit() 15 { 16 b.bInit(); 17 printf( "C public\n" ); 18 }다음과 같이 하였습니다. 이렇게 하였을 경우 C class는 B class public 에 접근 가능하므로 당연히 잘됩니다. C Class에 B클래스 인스턴스 선언하여
A class의 public 어떻게 접근해야하는지요 그리고 접근했을때 접근이 안되야하는데??????그리고 위의코드도 B를 통한 A멤버의 접근이 아닌가요?
nayana 님은 지금 상속과 포함을 혼동하고 계십니다. C 클래스에 뭔
nayana 님은 지금 상속과 포함을 혼동하고 계십니다. C 클래스에 뭔가를 포함시켰다는 것은 C 에서 그것을 자유롭게 사용하고 싶다는 것을 나타내기도 합니다. C 에 포함시키고서도 C 안에서 사용하지 못하도록 하는 것은 이상하지요?
다시 만드신 예제도 C 에 B 를 포함한 것입니다. 여기서 C 내부에서 B 의 public 멤버를 이용(!)한다는 것은 아무런 하자가 없는 합법적인 행동입니다. 설령 B 가 A 를 상속을 (private 이든 public 이든) 하고 A 의 public, proteced 멤버를 사용한다 하더라도 C 에서는 상관하지 않습니다. B 가 합법적으로 A 를 사용하고 있고 그 멤버가 외부로 노출된다면 C 에서 B 의 그 멤버를 사용하는 것은 아무런 문제가 없습니다.
지금 말씀하시고자 하는 것은 C 외부에서 C 를 사용하는 입장에서 C 내부의 A, B 중 일부는 열고 일부는 막고자 하는 것인가요? 이런 경우는 C 의 외부 인터페이스를 그에 맞게 권한설정을 하시고 만드셔야 합니다.
private, protected, public 의 키워드가 같이 사용되어서 같은 의미라고 생각하지 마시고 상속은 상속, 멤버의 권한은 권한 이렇게 분리해서 찬찬히 곰곰히 생각해보시고 책도 보시면 "아!하!" 하는 순간이 오실겁니다.
무엇을 할 것인지 정확하게 정하시고 도전해보시는 것이 혼동에서 벗어날 수 있는 유일한 길...
책에 이렇게 나와있습니다.[code:1]그 후대 클래스나 자식 클래스
책에 이렇게 나와있습니다.
그 후대 클래스나 자식 클래스의 객체, 즉 자식 클래스의 외부에서는 외부의 클래스의 모든 멤버가 private가 되기때문에 접근권한을 갖지 못한다.이말의 의미가 이중상속 받았을때...B클래스가 부모 class를 private로 받았기때문에...
가령 예를 들어서 class C: private B, or class C: public B,
class C: protected B 로 받았을때 B클래스가 A 클래스를 private로 받았기
때문에...안되는걸로 알고 있습니다. 이거는 당연히 B클래스가 부모를 private로 상속하였기때문에...당연히 안되는데.....제가 궁금한것은 그 후대의 클래스뿐만 아니라...자식 클래스의 객체 또한 그렇다고 하여...의문을 갖고 접근하고 있습니다.
[quote="nayana"]책에 이렇게 나와있습니다.[code:1]
네 만약 B 클래스의 객체를 하나 만들고 그 객체를 이용하는 곳에서 A 의 멤버를 호출할 수 없다는 것은 맞습니다. 즉 위의 코드를 다음과 같이 시험하면
B b; b.Init(); // A의 멤버를 B 객체를 사용하는 곳에서 사용하면 불법컴파일 에러가 나지 않던가요?
하지만, 예로 드신 코드들은 모두 A 나 B 를 포함하고 있지 않습니까? 그리고 B 로 만든 객체도 B 의 공개된 멤버만을 외부에서 호출하고 있지 A 의 멤버를 호출하고 있지는 않습니다.
좀 더 하시다보면, 상속에서 다양한 표현 방법이 있다는 것을 아시게 될 것입니다. 숙달되면 관용구처럼 사용하는 패턴들이 있습니다. 이런 것은 경험을 하시고 체득하셔야 하는 것이니 너무 조급하게 생각하지 마시고 천천히 하지만 정확하게 공부하시기를 바랍니다.
감사 합니다. 제가 잠시 착각을 했난 봅니다.제가 너무 한심스러워 보
감사 합니다. 제가 잠시 착각을 했난 봅니다.
제가 너무 한심스러워 보이는 군요...
정말로 답변 감사드립니다.
댓글 달기