2022. 4. 3. 04:18ㆍC++
Child 클래스가 Mom 클래스를 상속한다.
Child 클래스가 Mom 클래스를 상속하면 Child 클래스는 Mom 클래스가 지니고 있는 모든 멤버를 물려 받는다.
class Mom
{
private:
int age; //나이
string name; //이름
public:
Mom(int age, string name)
{
this->age = age;
this->name = name;
}
void ShowInfo()
{
cout<<"age: "<<age<<", name: "<<name<<endl;
}
~Mom(){}
}
아래는 child 클래스다.
class Child : public Mom //Mom 클래스의 상속을 의미함
{
private:
string favoriteFood;
public:
Child(int age, string name, string favoriteFood) : Mom(age, name)
{
this->favoriteFood = favoriteFood;
}
void MyInfo()
{
ShowInfo();
cout<<"my favorite food: "<<favoriteFood<<endl;
}
~Child(){}
};
단, Child에서 Mom 클래스의 private 멤버변수에 직접 접근하는 것은 불가능하다.
private처럼 외부의 접근은 막지만 Child 클래스에서 직접 접근하고 싶다면, 접근제어자 protected를 사용한다.
접근제어자 | private | protected |
외부접근 | X | X |
자식클래스 접근 | X | O |
세 가지 형태의 상속
위에서의 상속에서 의문점이 있었을 것이다.
class Child : public Mom
{
...
}
바로 여기의 public이 의미하는 바를 말이다.
사실 다른 접근 제어자로 교체하는 것도 가능하다.
class Child : private Mom
{
...
}
class Child : protected Mom
{
...
}
키워드 pulic, protected, private는 멤버의 접근 권한을 명시하는 용도로도 사용되지만, 상속의 형태를 명시하는 용도로도 사용된다.
C++ 접근제어 지시자의 접근 범위는 다음의 관계가 있다.
private < protected < public
protected 상속
> protected보다 접근 범위가 넓은 멤버는 protected로 변경시켜서 상속하겠다.
아래는 Base 클래스와 Derived 클래스다.
Class Base
{
private:
int num1;
protected:
int num2;
public:
int num3;
}
class Derived : protected Base
{}
protected로 상속했으니 클래스 Derived의 형태는 다음과 같다.
class Derived : protected Base
{
private:
int num1;
protected:
int num2;
protected:
int num3;
}
즉, 이 클래스는 외부에서 접근 불가능한 멤버가 된 것이다.
private 상속
> private보다 접근 범위가 넓은 멤버는 private로 변경시켜서 상속하겠다.
아래는 Base 클래스와 Derived 클래스다.
Class Base
{
private:
int num1;
protected:
int num2;
public:
int num3;
}
class Derived : private Base
{}
private로 상속했으니 클래스 Derived의 형태는 다음과 같다.
class Derived : private Base
{
private:
int num1;
private:
int num2;
private:
int num3;
}
즉, 이 클래스또한 외부에서 접근 불가능한 멤버가 된 것이다.
따라서 C++의 상속은 public상속만 있다고 생각해도 무방하다.
상속을 위한 기본 조건 IS-A 관계
한글로 일종의 ~이다. 로 해석된다.
예시를 들면
교과서는 일종의 책이다.
노트북은 일종의 컴퓨터이다.
다중 상속
class Person
{
public:
int age; //나이
void Eat()
{
cout<<"eat!"<<endl;
}
};
class Student: public Person
{
public:
void Study()
{
cout<<"study!"<<endl;
}
};
class Worker: public Person
{
public:
void Work()
{
cout<<"work!"<<endl;
}
};
class Researcher : public Student, public Worker
{
};
위의 코드의 상속관계는 아래 그림과 같다.
이렇듯 Researcher 클래스가 Student와 Worker 클래스를 상속 받고 있다.
C++에서는 이러한 다중 상속 관계를 허락한다.
여기서 문제는 Researcher 의 age 값을 정의할 때 발생한다.
아래의 코드는 오류를 발생한다.
int main(void)
{
researcher r1;
r1.age = 20;
return 0;
}
> 'age' is ambiguous 라는 오류를 발생시키는데 말그대로 age가 Worker에서 온 age인지 Student에서 온 age인지를 명시해줘야 한다는 것이다.
따라서 researcher의 나이가 2개가 되는 오류가 발생한다.
int main(void)
{
researcher r1;
r1.Student::age = 10;
r1.Worker::age = 20;
return 0;
}
'C++' 카테고리의 다른 글
동적 할당 (0) | 2022.04.03 |
---|---|
연산자 오버라이딩 (0) | 2022.04.03 |
Member Initializer (0) | 2022.04.03 |
new와 delete (0) | 2022.04.03 |
malloc & free (0) | 2022.04.03 |