C++ override, final, 공변 반환값
- 프로그래밍/C/C++
- 2019. 1. 7.
C++ override, final, 공변 반환값
override 키워드
#include <iostream>
using namespace std;
class A
{
public:
virtual void print(int x) { cout << "A" << endl; }
};
class B : public A
{
public :
void print(short x) { cout << "B" << endl; }
};
int main()
{
A a;
B b;
A &ref = b;
ref.print(1);
}
우리가 실수로 B 클래스의 print 함수 매개변수를 short로 했다고 예를 들어보자.
23행에서 print에 1을 넣어보면 A 클래스의 print 함수가 호출이 될 것이다.
근데 우리가 나올려는 결과는 B 클래스의 print 함수가 호출이 되어야 한다.
이 실수를 방지하기 위해 override 키워드를 사용해서 실수를 방지해보자.
#include <iostream>
using namespace std;
class A
{
public:
virtual void print(int x) { cout << "A" << endl; }
};
class B : public A
{
public :
void print(short x) override { cout << "B" << endl; }
};
int main()
{
A a;
B b;
A &ref = b;
ref.print(1);
}
13행에 override 키워드를 넣으면 오류가 뜰 것이다.
override 키워드는 "이 가상함수는 오버라이딩 함수이다!" 라고 알리는 것이다.
그럼 컴파일러가 "오버라이딩 하려는것은 알겠는데 매개변수가 달라서 오버라이딩이 안됬어 잘 봐봐" 라고 찾아서 오류를 잡아줄 것이다 그래서 프로그래머는 오류를 보고 int x로 고쳐줄것이다.
final 키워드
class A
{
public:
virtual void print() { cout << "A" << endl; }
};
class B : public A
{
public :
void print() final { cout << "B" << endl; }
};
class C : public B
{
public :
void print() { cout << "C" << endl; }
};
이런 클래스가 있다고 하면 10행에 final 키워드가 있다
final 키워드는 "자식 클래스에서 오버라이딩을 못하게 하겠다" 이 뜻이다.
그럼 C 클래스에서 print 함수를 오버라이딩을 못하게 한다. C 클래스 print 함수에서 오류가 날것이다.
공변 반환값
#include
using namespace std;
class A
{
public:
void print() { cout << "A" << endl; }
virtual A* getThis() { return this; }
};
class B : public A
{
public :
void print() { cout << "B" << endl; }
virtual B* getThis() { return this; }
};
int main()
{
A a;
B b;
A &ref = b;
b.getThis()->print();
ref.getThis()->print();
}
23행에서 A 래퍼런스 자료형에 B 클래스가 들어갔다.
24행은 b의 주소가 반환 되었으니 B가 출력이 될 것이고,
25행을 보자.
getThis() 함수는 가상함수로 선언이 되어있다. 그럼 B의 주소가 반환이 될 것이고 print() 함수를 호출하는데 A가 출력이 된다. 왜 그럴까??
일단 가상함수로 선언된 것은 선언된 자료형을 보는것이 아니라 A &ref = b; 에서 b 자료형을 보는것이다.
그럼 getThis() 함수에서 B 클래스의 getThis() 함수를 출력해 줄것이고,
B의 주소값을 반환 했고 print() 함수를 출력하면 print()함수는 가상 함수가 아니라 일반 멤버 함수이다.
그러므로 A클래스의 print() 함수가 출력이 되는 것이다.