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 답변
-
메인 함수의 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*
형인ptr
이Second
객체를 가리켰을 때,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; }
댓글 입력