1] 상속의 문법적인 이해
1. 상속의 방법과 그 결과
class Person
{
private:
int age;
char name[50];
public:
Person(int myage, char* myname) : age(myage)
{
strcpy(name, myname);
}
void WhatYourName() const
{
cout<<"My name is "<<name<<endl;
}
void HowOldAreYou() const
{
cout<<"i'm "<<age<<" years old"<<endl;
}
};
class UnivStudent : public Person
{
private:
char major[50];
public:
UnivStudent(char* myname, int myage, char* mymajor) : Person(myage, myname)
{
strcopy(major, mymajor);
}
void WhoAreYou() const
{
WhatYourName();
HowOldAreYou();
cout<<"My major is "<<major<<endl;
}
};
위 코드에서 class UnivStudent : public Person 부분이 상속 문법이다. pulbic의 의미는 나중에 살펴보기로 하자.
2. 자식(유도) 클래스의 객체 생성과정
class SoBase
{
private:
int baseNum;
public:
SoBase() : baseNum(20)
{
cout<<"SoBase()"<<endl;
}
SoBase(int n) : baseNum(n)
{
cout<<"SoBase(int n)"<<endl;
}
void ShowBaseData()
{
cout<<baseNum<<endl;
}
};
class SoDerived : public SoBase
{
private:
int derivNum;
public:
SoDerived() : derivNum(30)
{
cout<<"SoDerived()"<<endl;
}
SoDerived(int n) : derivNum(n)
{
cout<<"SoDerived(int n)"<<endl;
}
SoDerived(int n1, int n2) : SoBase(n1), derivNum(n2)
{
cout <<"SoDerived(int n1, int n2)"<<endl;
}
void showDerivData()
{
ShowBaseData();
cout<<derivNum<<endl;
}
};
int main(void)
{
cout<<"case1....."<<endl;
SoDerived dr1;
dr1.ShowDerivData();
cout<<"-------------"<<endl;
cout<<"case2...."<<endl;
SoDerived dr2(12);
dr2.ShowDerivData();
cout<<"-------------"<<endl;
cout<<"case3...."<<endl;
SoDerived dr3(23, 34);
dr3.ShowDerivData();
cout<<"--------------"<<endl;
return 0;
}
-> 결과
case1.....
SoBase()
SoDerived()
20
30
-------------
case2.....
SoBase()
SoDerived(int n)
20
12
-------------
case3.....
SoBase(int n)
SoDerived(int n1, int n2)
23
34
-------------
결론
: 자식 클래스의 객체생성 과정에서 부모 클래스의 생성자는 100% 호출된다.
: 자식 클래스의 생성자에서 부모 클래스의 생성자 호출을 명시하지 않으면, 부모 클래스의 void 생성자가 호출된다.
3. 자식(유도) 클래스의 객체 소멸과정
: 생성 과정과는 반대로 자식 클래스의 소멸자가 먼저 불리고, 부모 클래스의 소멸자가 나중에 불린다.
2] 세 가지 형태의 상속
: protected는 알고있다 시피 상속 클래스에서의 접근을 허용한다. 그러나 상속관계 에서도 정보은닉의 원칙을 지키는 것이 좋기 때문에 자주 사용되지는 않는다.
class Base
{
private:
int num1;
protected:
int num2;
private:
int num3;
}
1. protected 상속
: protected 상속의 의미는 "protected 보다 접근 범위가 넓은 멤버는 protected로 변경시켜서 상속하겠다." 는 뜻이다.
class Derived : protected Base
{
접근불가:
int num1;
protected:
int num2;
protected:
int num3;
};
Base 클래스에서 num1은 private 으로 선언되었기 때문에 자식 클래스인 Derived 에서도 접근이 불가능 하다. num3은 public으로 protected 보다 접근범위가 넓기 때문에 protected로 바껴서 상속된다.
2. private 상속
: private 상속의 의미는 "private 보다 접근 범위가 넓은 멤버는 private로 변경시켜서 상속하겠다." 라는 뜻이다.
class Derived : private Base
{
접근불가:
int num1;
private:
int num2;
private:
int num3;
};
이 경우 Derived 클래스를 다른 클래스가 상속한다면 접근할 수 있는 멤버변수가 하나도 없게 된다.
3. public 상속
: public 상속의 의미는 public 보다 넓은 접근 범위는 없기 때문에, 바꿔 말하면 이렇게 된다.
"private을 제외한 나머지는 그냥 그대로 상속한다."
사실 protected, private 상속은 다중상속과 같이 특별한 경우가 아니면 잘 사용하지 않는다.
'C++' 카테고리의 다른 글
[C++] 템플릿(Template)(1) (0) | 2017.12.25 |
---|---|
[C++] 상속과 다형성 (0) | 2017.12.25 |
[C++] Friend와 Static 그리고 Const (0) | 2017.12.25 |
[C++] 복사 생성자(Copy Constructor) (0) | 2017.12.23 |
[C++] 클래스의 완성 (1) | 2017.12.23 |