c++ 코드 에러 뜨는 이유 알려주세요

조회수 454회
#include<iostream>

using namespace std;

class First
{
public:
    void SimpleFunc() { cout << "First" << endl; };
};

class Second :public First
{
public:
    virtual void SimpleFunc() { cout << "Second" << endl; };

};


int main(void)
{
    First* ptr = new First();
    ptr->SimpleFunc();
    delete ptr;

    ptr = new Second();
    ptr->SimpleFunc();
    delete ptr;

    return 0;
}

void SimpleFunc() { cout << "First" << endl; }; 이 부분을 virtual 로 하면 정상 작동하는데 안하면 에러 뜨네요.

마지막 delete ptr에서 에러 뜨네요 이유가 뭐죠?

2 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    메인 함수의 6번째 줄에 있는 delete ptr;delete (Second*)ptr;로 수정해 보세요.

    나머지 부분에는 문제가 없어 보입니다.

    • 결과 (virtual 안붙였을 때)

    이미지

    • 결과 (virtual 붙였을 때)

    이미지

    ptr 변수를 반드시 재활용해야 하는 경우가 아니라면, 메인 함수를 아래처럼 수정해도 동일한 결과가 얻어집니다.

        First* ptr_first = new First();
        ptr_first->SimpleFunc();
        delete ptr_first;
    
        Second* ptr_second = new Second();
        ((First*)ptr_second)->SimpleFunc();
        delete ptr_second;
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 질문자님이 작성해주신 소스코드를 보면 Second 클래스는 First클래스를 상속받고 있습니다.

    First형 포인터 변수는(여기서는 ptr) First객체 혹은 First를 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있습니다.

    그러므로 First를 상속받은 Second 객체도 가리킬 수 있으므로 First*형이지만 ptr = new Second(); 이 구문이 가능한 것입니다.

    하지만, 멤버 접근은 포인터 형에 해당하는 클래스(여기선 First)에 정의된 멤버만 가능하기 때문에

    ptr = new Second();
    ptr->SimpleFunc();
    

    이 구문에서 First::SimpleFunc()가 호출됩니다.

    이러한 상황을 방지하기 위해 '가상함수'를 사용합니다.

    First클래스에서 SimpleFunc()virtual키워드를 사용하면, 마지막으로 오버라이딩한 Second::SimpleFunc()가 호출이 됩니다.

    아래와 같이 소스코드를 작성하시려 한 것 같은데, 이와 같이 짠다면 오류는 없을 것입니다.

    virtual키워드를 사용해서 First*형인 ptrSecond객체를 가리켰을 때, Second의 멤버함수를 호출 시킬 수 있는 소스코드입니다.

    #include<iostream>
    
    using namespace std;
    
    class First
    {
    public:
        virtual void SimpleFunc() { cout << "First" << endl; };
    };
    
    class Second :public First
    {
    public:
        void SimpleFunc() { cout << "Second" << endl; };
    
    };
    
    
    int main(void)
    {
        First* ptr = new First();
        ptr->SimpleFunc();
    
        ptr = new Second();
        ptr->SimpleFunc();
        delete ptr;
    
        return 0;
    }
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)