Game Develop

[C++] 상속받은 가상함수에는 virtual,override 생략해도된다. 본문

C++/C++

[C++] 상속받은 가상함수에는 virtual,override 생략해도된다.

MaxLevel 2022. 9. 1. 00:51

 

class Parent
{
public:
    Parent() { cout << "부모클래스 기본생성자 호출 !" << endl; }
    Parent(const Parent& arg)  { cout << "부모클래스 복사생성자 호출 !" << endl; }
    ~Parent() { cout << "부모클래스 소멸자 호출 !" << endl; }

    virtual void Print() { cout << "부모클래스 Print입니다~" << endl; }
};

class Child : public Parent
{
public:
    Child() { cout << "자식클래스 기본생성자 호출 !" << endl; }
    Child(const Child& arg)   {cout << "자식클래스 복사생성자 호출 !" << endl;}
    virtual ~Child() { cout << "자식클래스 소멸자 호출 !" << endl; }
    void Print() { cout << "자식클래스 Print입니다~" << endl; }
};

int main()
{
    Parent* parent = new Child();
    parent->Print();

    return 0;
}

 

위의 결과는? 제목에 써놓은 내용을 몰랐더라면, 자식클래스의 Print()함수에 virtual과 override 키워드가 안붙어 있으니,  parent의 Print()가 호출될거라고 생각하겠지만... 

 

보다시피 자식클래스의 Print()함수가 잘 호출된다. 사실 나는 override는 생략해도 되는걸 알고 있었는데, virtual까지 생략해도 되는줄은 몰랐다. 포트폴리오 만들 때는 되도록 뭐든간에 명시적으로 선언하는 스타일이라서 전부 virtual과 override를 명시하다보니 이런 부분은 놓쳤었다.

꼭 new 연산자를 통한 동적할당(런타임 중 메모리할당)에만 적용되는건 아니고, 아래처럼 정적할당(컴파일 시 고정된크기의 메모리할당)을 통해서도 가능하다.

 

 

    Child child;
    Parent* parent = (Parent*)&child;
    parent->Print(); 

 

마찬가지로 자식클래스의 Print가 잘 호출된다.