Inheritance

2022. 4. 3. 04:18C++

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