부모클래스에서 자식 클래스 멤버함수를 호출하는 방법

kws4679의 이미지

객체지향 프로그래밍 연습하려고 그림을 그리는것에서

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 를

호출하려고 했는데 컴터가 폭주해버립니다.... 컴파일은 잘 되는데 ㅠㅠ

어떤게 문제일까요 그리고 어떻게 하면 더 좋은 설계가 될지

선배님들 조언 부탁드립니다!!!

kukyakya의 이미지

http://codepad.org/a3zurXOq

원하시는게 이런거 아닌가요?

shint의 이미지

상속 오버라이딩 함수 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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.