반응형

오버라이드

  • function override
    • 기반 클래스의 함수를 파생 클래스에서 재정의 할 수 있음
  • 기반 클래스의 포인터로 파생 클래스 객체를 가르킬때(Animal* p = &dog)
    • p->Cry() : C++은 Animal::Cry() 호출, java는 Dog::Cry()  호출
  • virtual function
    • 멤버 함수 호출시, 포인터 타입이 아닌 실제 객체에 따라 함수를 호출
    • 실행 시간에 포인터가 가리키는 메모리를 조사한 후 호출 하는것
// 기본 타입 예제
#include <iostream>
#include <vector>

class Animal
{
public:
    void Cry()
    {
        std::cout << "Animal Cry" << std::endl;
    }
};

class Dog : public Animal
{
public:
    // 함수 오버라이드(override)
    void Cry()
    {
        std::cout << "Dog Cry" << std::endl;
    }
};
int main()
{
    Animal a; a.Cry(); // Animal::Cry() 호출
    Dog d; d.Cry(); // Dog::Cry() 호출

    Animal* p = &d;
    p->Cry(); // Animal::Cry() 호출,  C++에서는 포인터 메모리 타입의 함수를 호출함
}

/////////////////////////////////////////////////////////////

// 가상 함수 변경 예저
#include <iostream>
#include <vector>

class Animal
{
public:
    // 가상 함수
    virtual void Cry()
    {
        std::cout << "Animal Cry" << std::endl;
    }
};

class Dog : public Animal
{
public:
    // 함수 오버라이드(override)
    virtual void Cry()
    {
        std::cout << "Dog Cry" << std::endl;
    }
};
int main()
{
    Animal a; a.Cry(); // Animal::Cry() 호출
    Dog d; d.Cry(); // Dog::Cry() 호출

    Animal* p = &d;
    p->Cry(); // Dog::Cry() 호출, 가상 함수이므로 객체에 따라 함수 호출
}

virtual function

  • 가상 함수 재정의(override)시에는 virtual 키워드는 붙여도 되고 붙이지 않아도 됨
  • 가상 함수 재정의시 실수를 막기 위해서 override 키워드를 사용(C++11)
  • 가상 함수를 선언과 구현으로 분리 할때는 선언부에만 virtual, override을 표기
#include <iostream>
#include <vector>

class Animal
{
public:
    virtual void Cry()
    {
        std::cout << "Animal Cry" << std::endl;
    }
};

class Dog : public Animal
{
public:
    // 함수 오버라이드(override)
    virtual void Cry() override // virtual, override를 제거해도 빌드 되지만 실수 방지용
    {
        std::cout << "Dog Cry" << std::endl;
    }
};
int main()
{
    Animal a; a.Cry();
    Dog d; d.Cry();

    Animal* p = &d;
    p->Cry();
}

 

virtual destructor

  • Upcasting사용시 기반 클래스의 소멸자는 반드시 가상 소멸자여야 함
class Base
{
public:
    Base() { std::cout << "Base 자원 할당" << std::endl; }
    virtual ~Base() { std::cout << "Base 자원 해지" << std::endl;  }
};

class Derived : public Base
{
public:
    Derived()
    {
        std::cout << "Derived 자원 할당" << std::endl;
    }
    virtual ~Derived()
    {
        std::cout << "Derived 자원 해지" << std::endl;
    }
};

int main()
{
    Derived* p = new Derived;
    delete p;
}
반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 추상 클래스(Abstract Class)  (0) 2019.05.12
C++ 상속 예제(Polymorphism)  (0) 2019.05.12
C++ 업캐스팅(Up Casting)  (0) 2019.05.12
C++ 상속(Inheritance)  (0) 2019.05.12
C++ STL 정리  (0) 2019.05.12

+ Recent posts