kyuseo의 게임 프로그래밍

암묵적으로 상속받은 부모의 함수 감춤 현상과 해결책 본문

C++ 개발

암묵적으로 상속받은 부모의 함수 감춤 현상과 해결책

kyuseo 2008. 1. 6. 18:03

개요..

 

부모 클래스와 자식 클래스가 같은 함수의 이름을 사용하면 발생하는 암묵적으로 상속받은 부모 클래스의 함수 감춤 현상과 해결책을 알려드립니다.

 

핵심내용은 using 키워드의 사용입니다.

 

 

오류 내용

 

class CParent

{

public:

CParent(){};

virtual ~CParent(){};

 

virtual void Fun( int n )

{

printf( "CParent Fuc Int %d\n", n );

}

 

virtual void Fun( char* sz )

{

printf( "CParent Fun String %s\n", sz );

}

};

 

class CChild : public CParent

{

public:

CChild(){};

virtual ~CChild(){};

 

void Fun( double dbl )

{

printf( "CChild Fun Double %f\n", dbl );

}

};

 

int main(int argc, char* argv[])

{

CParent parent;

CChild child;

 

parent.Fun( 100 );

parent.Fun( "Hi" );

 

child.Fun( "Hi" ); //*** 함수명 중목으로 인한 부모의 함수 감춤현상이 일어나서 컴파일시 오류 발생

child.Fun( 100 ); //*** 위와 같은 이유로 Fun( int n ) 호출이 아닌 Fun( double dbl ) 을 호출하게 된다.

 

child.Fun( 9.11 );

   

return 0;

}

 

 

 

해결책

 

 

class CParent

{

public:

CParent(){};

virtual ~CParent(){};

 

virtual void Fun( int n )

{

printf( "CParent Fuc Int %d\n", n );

}

 

virtual void Fun( char* sz )

{

printf( "CParent Fun String %s\n", sz );

}

};

 

class CChild : public CParent

{

public:

    using CParent::Fun; //***** 1.using 명령어를 이용하여 부모의 Fun 함수를 자식에서도 이용한다고 명기한다.

 

CChild(){};

virtual ~CChild(){};

 

void Fun( double dbl )

{

printf( "CChild Fun Double %f\n", dbl );

}

};

 

int main(int argc, char* argv[])

{

CParent parent;

CChild child;

 

parent.Fun( 100 );

parent.Fun( "Hi" );

 

child.CParent::Fun( "Hi" ); //***** 2.명확하게 부모의 Fun 함수를 호출한다.

child.Fun( "Hi" );

child.Fun( 100 );

child.Fun( 9.11 );

 

return 0;

}