C++ override, final, 공변 반환값


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() 함수가 출력이 되는 것이다.



댓글

Designed by JB FACTORY