클래스 상속
부모(베이스) 클래스 안에 있던 멤버 변수와 멤버 함수를 물려받아 새로운 클래스를 작성할 수 있게 된다. 객체지향 언어의 가장 큰 특징이며 장점이라고 생각된다.
1. 구현방법
class Person
{
~~~~부모
}
class Student : Person
{
~~~~자식
}
Person은 부모 클래스 Student는 자식 클래스라 보면 자식 클래스 옆에 : 을 사용하여 Person의 자식이라는 것을 정의한다.
2. 예시
class Person
{
private:
string name;
public:
Person(string name) : name(name)
{
}
string GetName()
{
return name;
}
};
class Student : Person
{
private:
int studentID;
public:
Student(int studentID, string name) : Person(name)
{
this->studentID = studentID;
}
void Show()
{
cout << "학생 번호 : " << studentID << '\n';
cout << "학생 이름 : " << GetName() << '\n';
}
};
int main()
{
Student student(1,"han");
student.Show();
system("pause");
}
Student라는 객체를 새로 생성하면서 생성자를 통해 학생 번호와 이름을 부여하고 있다. Student는 name이라는 변수는 없지만 Person(name)을 통해 부모의 변수의 값을 넣을 수 있게 된다.
3. 다중 상속
class TempClass
{
public :
void ShowTemp()
{
cout << "임시 부모 \n";
}
};
class Student : Person, public TempClass
{
private:
int studentID;
public:
~~~...
int main()
{
Student student(1,"han");
student.ShowTemp();
system("pause");
}
C#은 안되지만, C++은 다중 상속이 가능하다.
4. 장점
1) 코드 중복이 없어진다. 2) 함수 재활용이 가능해진다.
오버라이딩
상속받은 자식 클래스에서 부모 클래스의 함수를 사용하지 않고 자식 클래스의 함수로 재정의 해서 사용하는 것이다. 아래 예시를 보면 쉽게 이해가 될 것이다.
class Person
{
private:
string name;
public:
Person(string name) : name(name)
{
}
string GetName()
{
return name;
}
void ShowName()
{
cout << "이름 :" << GetName() << '\n';
}
};
class Student : Person, public TempClass
{
private:
int studentID;
public:
Student(int studentID, string name) : Person(name)
{
this->studentID = studentID;
}
void Show()
{
cout << "학생 번호 : " << studentID << '\n';
cout << "학생 이름 : " << GetName() << '\n';
}
void ShowName()
{
cout << "학생 이름 :" << GetName() << '\n';
}
};
int main()
{
Student student(1,"han");
student.ShowName();
system("pause");
}
부모인 Person클래스도 ShowNmae() 함수가 있고, 자식인 Student도 ShowName() 함수가 있다. 이 과정을 오버 라이딩이며 부모 함수를 무시하고 자식 함수를 실행하게 된다.
추가적으로
1. 자식(파생) 클래스의 객체를 생성하면, 부모(베이스) 클래스의 생성자를 호출한 뒤, 자식 클래스의 생성자가 호출된다.
2. 소멸자는 반대로 자식 클래스가 먼저 호출되고 그 후에 부모 클래스의 소멸자가 호출된다.
'프로그래밍언어 > C++' 카테고리의 다른 글
C++) 함수 오버로딩 / 연산자 오버로딩 (0) | 2020.06.23 |
---|---|
C++) 생성자와 소멸자 (0) | 2020.06.10 |
C++)접근 제한자 (0) | 2020.06.09 |
C) 배열/문자열과 포인터. (0) | 2020.05.02 |
C) 파일 입출력 (FILE,fopen,fclose) (0) | 2020.05.02 |