티스토리 뷰

반응형

Override

예전 C++에서 상속받은 함수를 재정의 할때 만약 오타가 났다면

그냥 그대로 해당 클래스에 메서드가 생겨버리는 문제가 있었다. 

이를 해결하기 위해서 override라는 키워드가 생겼다.

 

#include <iosteam>

class Base
{
public:
    virtual void foo() {}
    virtual void goo(int) {}
};

class Derived : public Base
{
public:
	void foo()			override {}
    void goo(int a)		override {}

    void fooo()         override {} // error
    void goo(double)    override {} // error
};

 

다음과 같이 사용하면, 함수의 이름이 틀렸거나 인자의 자료형이 다르다면 오류가 난다.

상황에 따라서 쓰는게 아닌 무조건 쓰도록 하는 것을 권장한다.

 

가상 소멸자

만약, upcasting을 한 뒤 기반 클래스 포인터를 삭제할 때, 캐스팅된 자식 클래스도 소멸이 잘 될까?

컴파일러는 기반클래스라는 것만 알고 있기 때문에 삭제 되지 않는다.

그래서 우리는 기반클래스의 소멸자를 가상 함수로 만들어야 한다.

 

기반 클래스의 소멸자가:

  • 1. 가상함수가 아닐 경우: 무조건 기반 클래스 소멸자 호출
  • 2. 가상함수일 경우: 포인터가 가리키는 메모리를 조사후 소멸자 모두 호출
#include <iostream>

class Base
{
public:
    Base() {}
    //~Base(){}
    virtual ~Base(){} // 기반 클래스는 소멸자가 가상함수 이어야 한다.
};
 
class Derived : public Base
{
public:
    Derived()  { std::cout << "Derived()"  << std::endl;}
    ~Derived() { std::cout << "~Derived()" << std::endl;}
};
 
int main()
{
    Derived* p1 = new Derived; 
    delete p1; 
 
    Base* p2 = new Derived; 
 
    delete p2; // 만약 Base의 소멸자가 가상함수가 아니라면
				// 캐스팅된 Derived 객체는 소멸되지 않는다
}
728x90
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
250x250