반응형
오버라이드
- 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 |