상속을 간단하게 표현하면?
- 상속이란 A라는 클래스의 멤버를 B라는 클래스에서도 사용할 수 있도록 하는 것
- 또한, B라는 클래스가 A라는 클래스의 기능을 확장할 수 있게 하는 것
virtual 키워드란?
- override와 final 키워드는 virtual과 짝꿍으로 사용된다.
- virtual은 상속 받은 자식 클래스에서 해당 함수를 오버라이딩 해서 사용하라는 것을 알려주는 키워드이다.
- 또한, 다형성을 구현할 수 있다.
- virtual 키워드를 사용하게 된다면 업캐스팅을 하였을 때 동적 바인딩을 할 수 있게 된다.
- 원래 업캐스팅을 하게 된다면 정적 바인딩으로 인해 부모의 함수를 호출함
class Parent {
public:
void print() {
std::cout << "이곳은 Parent 입니다." << std::endl;
}
};
class Child : public Parent {
public:
void print() {
cout << "이곳은 Child 입니다." << endl;
}
};
void main() {
Parent* p = new Parent;
Child* c = new Child;
p->print();
p = c;
p->print(); //<--- Static binding
}
output
이곳은 Parent 입니다.
이곳은 Parent 입니다.
class Parent {
public:
virtual void print() {
std::cout << "이곳은 Parent 입니다." << std::endl;
}
};
class Child : public Parent {
public:
virtual void print() {
cout << "이곳은 Child 입니다." << endl;
}
};
void main() {
Parent* p = new Parent;
Child* c = new Child;
p->print();
p = c;
p->print(); //<--- Dynamic binding
}
output
이곳은 Parent 입니다.
이곳은 Child 입니다.
- virtual 키워드를 사용해서 함수 오버라이딩을 강제할 수 있다.
- 순수 가상 함수를 만들면 된다.
override란?
- 오버라이드 키워드를 사용해 오버라이딩 함수라는 것을 명시할 수 있음
- interface가 변경되었을 때 Derived 클래스에 컴파일 에러를 발생시킬 수 있음
class Parent {
virtual void func(int x);
};
class Child : public Parent {
virtual void func(); //<--- 컴파일은 잘 되지만 동작은 이상해짐
};
- 사실 오버라이드 키워드를 사용하지 않고 순수 가상함수를 사용해도 위 문제는 해결 할 수 있다.
- 하지만, 부모에 순수 가상함수나 가상함수가 사라진다면 감지를 하지 못한다.
class Parent {
virtual void func(int x);
};
class Child : public Parent {
void func() override; //<--- override한다고 컴파일러에게 알리는 것
};
- override키워드를 사용하면 오버라이드할 함수에 virtual를 굳이 붙일 필요가 없어진다.
- virtual이나 override를 붙이지 않아도 Derived의 func는 오버라이딩된 함수이다.
- 하지만 컴파일 에러를 잡아내기 위해 override를 붙인다.
- 굳이 붙일 필요가 없어지는 이유는 중복된 표현이기 때문이다.
final이란?
- 상속을 방지하거나 가상함수를 더이상 오버라이딩 하지 않게 해준다.
- 부모 클래스의 멤버를 자식이 재정의 하지 못하도록 막을 때 사용
- 부모 클래스를 자식이 상속 받을 때 클래스 자체를 더이상 상속이 불가능하게 만들 수 있음
- final이 붙은 함수를 상속 받아서 사용하려 할때 컴파일 에러가 발생
class Parent {
virtual void func(int x);
};
class Child : public Parent {
void func() final; //<--- 마지막 override를 의미
};
출처
https://coding-factory.tistory.com/699
https://blockdmask.tistory.com/415
'C++' 카테고리의 다른 글
[C++] 참조자 (0) | 2024.12.16 |
---|---|
[C++] 이름 공간 (0) | 2024.12.16 |
[C++] 구조적 바인딩 (0) | 2024.12.13 |
[C++] 람다 함수 (1) | 2024.12.13 |
<C++> enum class (0) | 2024.04.04 |