부모클래스에서 자식 클래스 멤버함수를 호출하는 방법
글쓴이: kws4679 / 작성시간: 화, 2011/03/15 - 10:14오후
객체지향 프로그래밍 연습하려고 그림을 그리는것에서
Shape 란 기본 객체를 만들고 이를 상속하는 Box 라는 객체를 만들었습니다
class Shape {
private:
...
public:
void moveShape(int x, int y);
virtual void drawShape();
...
};
class Box : Shape {
private:
...
public:
void drawShape();
};
제 미숙한 실력으로 생각해본결과 모든 그려지는 모양은 움직이는것은 단지 x,y방향으로 이동만
하면 되므로 이는 부모 클래스에 존재하고 실제 구현은 각 모양마다 다르므로
가상함수를 통해 각각 구현하기로 했습니다 그런데 moveShape 함수 내부에서
좌표를 움직이고 새로 갱신된 좌표대로 박스를 그려야 하는데 이때
drawShape() 를 어떻게 호출해야 할지 모르겠습니다
void Shape::moveShape(int x, int y)
{
this->drawShape();
}
나름대로 머리를 굴려서 생성된 Box 객체 내에서 this 포인터를 통해 drawShape 를
호출하려고 했는데 컴터가 폭주해버립니다.... 컴파일은 잘 되는데 ㅠㅠ
어떤게 문제일까요 그리고 어떻게 하면 더 좋은 설계가 될지
선배님들 조언 부탁드립니다!!!
Forums:


http://codepad.org/a3zurXOq
http://codepad.org/a3zurXOq
원하시는게 이런거 아닌가요?
참고해보세요.
상속 오버라이딩 함수 VS 가상 함수 (OVERRIDING VS PURE VIRTUAL FUNCTION)
http://codepad.org/xSQAfwf8
#include <stdio.h> #include <sys/time.h> #include <unistd.h> //https://kldp.org/node/101730 //https://www.joinc.co.kr/w/man/2/gettimeofday //실행 시간 구하는 함수 struct timeval val_old; void getdoubledt(char *dt) { struct timeval val; struct tm *ptm; gettimeofday(&val, NULL); ptm = localtime(&val.tv_sec); memset(dt , 0x00 , sizeof(dt)); // format : YYMMDDhhmmssuuuuuu sprintf(dt, "%04d% 02d %02d %02d %02d %02d %06ld" , ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday , ptm->tm_hour, ptm->tm_min, ptm->tm_sec , val.tv_usec); printf("%06ld\t", val.tv_usec - val_old.tv_usec); val_old = val; } //---------------------- //https://csstudy.wordpress.com/2014/01/21/상속-오버라이딩-함수-vs-가상-함수-overriding-vs-pure-virtual-function/ class ParentClass { public: ParentClass(){} ~ParentClass(){} void func() { std::cout << "I am in ParentClass" << std::endl; } virtual void func2() { std::cout << "I am in ParentClass func2()" << std::endl; } }; class ChildClass : public ParentClass { public: ChildClass(){} ~ChildClass(){} void func() { std::cout << "I am in ChildClass" << std::endl; } virtual void func2() { std::cout << "I am in ChildClass func2 ()" << std::endl; } } ; //---------------------- class CTest { private: int m_nVAL; friend class CChild; public: CTest(){}; ~CTest(){}; }; class CChild : private CTest { public: CChild(){}; ~CChild(){}; void fn() { m_nVAL = 123; printf("m_nVAL %d\n", m_nVAL); } }; //---------------------- class CTest2 { public: int m_nVAL2; friend class CChild2; virtual void fn() = 0; public: CTest2(){}; ~CTest2(){}; }; class CChild2 : private CTest2 { public: CChild2(){}; ~CChild2(){}; void fn() { m_nVAL2 = 123; printf("m_nVAL2 %d\n", m_nVAL2); } }; int main() { //---------------------- { //자식 클래스 실행 ChildClass* c = new ChildClass(); c->func(); //부모 클래스 실행 ParentClass* p = new ParentClass(); p->func(); ParentClass* pc = new ChildClass(); //부모 함수 실행 pc->func(); //자식 함수 실행 pc->func2(); delete c; delete p; delete pc; } //---------------------- //자식 클래스 함수 사용하는 방법 { CTest t; CChild* c; c = (CChild*) &t; c->fn(); } //---------------------- //부모 클래스에서 순수 가상함수를 사용하는 방법 { CTest2 * t; CChild2 c; t = (CTest2 *) &c; t = (CTest2 *) new CChild2(); t->fn(); delete t; } return 0; } //출력 I am in ChildClass I am in ParentClass I am in ParentClass I am in ChildClass func2 () m_nVAL 123 m_nVAL2 123//
오버로딩 / 오버라이딩 / 다형성
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=974509&ref=974509&page=1
http://memoryfilm.tistory.com/16
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기