728x90
반응형
1. 가상 함수 관련 문법 정리
class Shape {
pbulic:
virtual void Draw() {}
};
class Rect : public Shape {
public:
virtual void Draw() {} // ok
// void Draw() {} // ok
};
int main() {
}
① 파생 클래스에서 가상 함수 재정의 (override) 할 때
=> virtual 키워드는 붙여도 되고 붙이지 않아도 된다.
=> 되도록이면 붙이는 것이 가독성이 좋다.
class Base {
public:
virtual void f1() {}
virtual void f2(int) {}
virtual void f3() const {}
};
class Derived : public Base {
public:
virtual void ff1() {}
virtual void f2(double) {}
virtual void f3() {}
};
int main() {
}
위의 코드는 Base에 있는 세개의 함수를 Derived에서 재정의 하는 코드이다.
근데 자세히보면 f1은 오타로 ff1으로, f2는 인자를 잘 못 적고, f3는 상수 멤버함수를 비상수 멤버함수로 했다.
문제는 빌드 했을 때 문제가 없다는 것이다.
왜 에러가 없냐면 컴파일러는 3개를 전부 별도의 함수를 만든 것으로 보기때문에 문제가 없다.
그래서 가상 함수를 재정의할 때 이 문제가 심각했었는데 C++11부터 새로운 문법이 나왔다.
class Base {
public:
virtual void f1() {}
virtual void f2(int) {}
virtual void f3() const {}
};
class Derived : public Base {
public:
virtual void ff1() override {}
virtual void f2(double) override {}
virtual void f3() override {}
};
int main() {
}
② override - C++11
=> 실수를 방지하기 위해 override를 붙이는 것이 좋다.
class Base {
public:
virtual void f1() {}
virtual void f2(int) {}
virtual void f3() const final {}
};
class Derived : public Base {
public:
virtual void f1() override {} // ok
virtual void f2(int) override {} // ok
virtual void f3() override {} // error
};
int main() {
}
③ final - C++11
=> 파생 클래스에서 가상함수를 재정의 할 수 없도록 하기 위해
// rect.h
#include "Shape.h"
class Rect : public Shape {
public:
virutal void Draw() override final;
};
// rect.cpp
#include "Rect.h"
void Rect::Draw() {
}
④ 선언과 구현으로 분리할 때는
=> virtual, override, final 키워드는 선언부에만 표기하고 구현부에는 표기하지 않는다.
728x90
반응형
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 추상 클래스 (abstract class) (0) | 2019.11.30 |
---|---|
[C++] 가상 소멸자 (0) | 2019.11.30 |
[C++] 가상 함수 (virtual function) (2) | 2019.11.26 |
[C++] upcasting (0) | 2019.11.26 |
[C++] 상속에서의 생성자 소멸자 (0) | 2019.11.26 |