728x90
자식 클래스의 참조 또는 포인터를 부모 클래스의 참조, 포인터로 변환하는 것을 Upcasting이라 합니다.
반대로 부모 클래스의 참조, 포인터를 명시적인 형변환을 통해 자식 클래스로 변환하는 것을 Downcasting이라 합니다.
Bus 클래스가 Car 클래스를 상속할 때, 각각 아래의 경우를 나타냅니다.
class Car {}
class Bus : public Car {}
int main()
{
Bus bus;
Car* car = &bus; // Upcasting
Car car;
Bus* bus = (Bus*)&car; // Downcasting
}
아래의 코드를 한 번 실행해 보겠습니다.
#include <iostream>
using namespace std;
class Car
{
int speed;
public:
void name() {
cout << "my name is car" << endl;
}
};
class Bus : public Car
{
int color;
public:
void name() {
cout << "my name is bus" << endl;
}
};
int main()
{
Bus bus;
Car* car = &bus;
car->name();
}
Java에 익숙하신 분들께서는 당황하셨을 것입니다. 당연히 bus의 name()이 호출되었어야 할 것 같은데 실행 결과는 "my name is car" 이기 때문입니다.
생각했던 대로의 결과를 얻기 위해서는 Car의 함수에 virtual 키워드를 붙이시면 됩니다.
virtual 함수는 파생 클래스의 동작을 재정의할 수 있게 도와줍니다. 이는 결과값이 compile time에 정해지지 않고 runtime에 정해지게 한다는 것입니다.
주로 override되는 함수에 붙게 되어 파생 클래스에서는 override 키워드를 사용하여 표기를 해줍니다. (optional, C++ 11 이후)
자세한 설명은 아래 사이트를 참조해 주시기 바랍니다.
- en.cppreference.com/w/cpp/language/virtual
#include <iostream>
using namespace std;
class Car
{
int speed;
public:
virtual void name() {
cout << "my name is car" << endl;
}
};
class Bus : public Car
{
int color;
public:
void name() override {
cout << "my name is bus" << endl;
}
};
int main()
{
Bus bus;
Car* car = &bus;
car->name();
}
'Pattern > C++' 카테고리의 다른 글
[C++] 템플릿 메소드 패턴 (Template method pattern) (0) | 2021.03.21 |
---|---|
[C++] 프로토타입 패턴 (Prototype pattern) (0) | 2021.03.21 |
[C++] interface와 결합(Coupling) (0) | 2021.03.20 |
[C++] 추상 클래스 (abstract class) (0) | 2021.03.20 |
[C++] Protected 생성자, 소멸자의 사용 방법 (0) | 2021.03.20 |