다중 상속
C++에서는 하나의 클래스가 여러 클래스에 대해 is a 상속이 가능합니다.
다만, 다중 상속은 복잡한 문제를 야기하기 때문에 최근에 등장하는 언어들은 지원하지 않는 추세입니다.
#include <iostream>
class Person
{
public:
Person()
{
std::cout << "Person" << std::endl;
}
void Speak()
{
std::cout << "Person speak" << std::endl;
}
};
class Student : public Person
{
public:
Student()
{
std::cout << "Student" << std::endl;
}
void Speak()
{
std::cout << "Student speak" << std::endl;
}
};
class Employee : public Person, Student
{
public:
Employee()
{
std::cout << "Employee" << std::endl;
};
};
int main(int argc, const char * argv[])
{
Employee employee;
//employee.Speak();
return 0;
}
Person
Person
Student
Employee
다중 상속은 ,를 이용하여 각각의 클래스를 나열해주면 됩니다.
Student class는 Person class를 상속합니다.
그리고, Employee class는 Person과 Student를 상속합니다.
Student가 이미 Person을 상속하고 있기 때문에 Employee는 Person을 상속할 필요가 없긴 합니다만
상속 단계가 많아지면 위와 같은 일이 종종 발생할 수 있습니다.
상속으로 나열한 클래스 중 가장 첫 클래스부터 생성자가 호출됩니다.
- Employee의 상속 클래스 중 가장 앞의 Person의 생성자가 가장 먼저 호출됩니다.
- Employee의 상속 클래스 중 다음 클래스인 Student의 생성자가 호출됩니다.
이때, Student는 Person을 상속하고 있으므로, Person의 생성자가 호출된 뒤 Student의 생성자가 호출됩니다.
3. 모든 상속 클래스의 생성자가 호출되었으므로 Employee의 생성자가 호출됩니다.
다중 상속 모호성 (ambiguity)
Person은 Speak 메소드를 가지고 있습니다.
Student은 Person을 상속하고 Person의 Speak 메소드를 오버라이딩 합니다.
그리고, Employee는 Person과 Student를 상속합니다.
이때 Employee의 Speak 메소드를 호출하면, 둘 중 어떤 메소드가 호출되어야 할까요?
Person의 Speak 및 Student의 Speak 모두 Speak라는 메소드로 상속됩니다.
컴파일러는 둘 중 어떤 것이 프로그래머의 의도사항인지 확인할 수 없습니다.
이와 같은 문제로 다중 상속은 컴파일러를 복잡하게 만들고, 프로그래머가 실수할 가능성을 만들어 냅니다.
따라서, 다중 상속을 할 경우에는 주의하여 사용할 필요가 있습니다.