갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 게임 디자인 패턴
  • 유니티 그래프
  • 전세계 게임 매출
  • c# Thread
  • C# 예외 처리
  • 모바일 게임 순위
  • 전세계게임매출순위
  • c# delegate
  • 강남 방탈출
  • c# collection
  • 자바
  • Unity Graph
  • c# unboxing
  • 유니티 골드그래프
  • pc 게임 순위
  • 알고리즘
  • C++
  • 글로벌게임매출
  • 유니티 그래프 그리기
  • c# 코루틴
  • C# boxing
  • c# coroutine
  • pc게임 순위
  • C++ 상속
  • 2020년 게임 매출
  • 게임 매출 순위
  • C++ virtual
  • 게임매출순위
  • 롤 골드그래프
  • C++ 소멸자

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C++] 가상 함수 문법 정리
프로그래밍/C++

[C++] 가상 함수 문법 정리

2019. 11. 28. 01:05
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
    '프로그래밍/C++' 카테고리의 다른 글
    • [C++] 추상 클래스 (abstract class)
    • [C++] 가상 소멸자
    • [C++] 가상 함수 (virtual function)
    • [C++] upcasting
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바