혹시 가상함수는 Inline 되지 않는다고 생각하는 분들도 아마 있지 않을까 생각하는데 경우에 따라서 되기도 하고 안되기도 합니다.

 

되는 경우는 컴파일 시점에서 어떤 클래스의 가상함수를 사용하는지 알수 있느냐 입니다.

struct Base

{

    virtual void Function(void) const = 0:

};

 

struct Delived

{

    virtual void Function(void) const

    {

         std::cout << "Hello" << std::endl;

    }

};

 

int main(int, char**)

{

    Delived  delived;

    delived.Function();

     return 0;

}

위 코드의 경우 컴파일 시점에서 Delived 클래스의 Function 멤버를 사용한다는 것을 알 수 있디 때문에 가상함수인 Function Inline화 할 수 있습니다.

 

 

struct Base

{

    virtual void Function(void) const = 0:

};

 

void Call( Base &base )

{

    base.Function();

}

 

struct Delived:  public Base

{

    virtual void Function(void) const

    {

         std::cout << "Hello" << std::endl;

    }

};

 

int main(int, char**)

{

    Delived   delived;

    Call( delived );

     return 0;

}

그럼 이 코드의 Function 멤버는 Inline화 할 수 있을까요? 물론 됩니다. 이유는 이것도 컴파일 시점에서 어떤 클래스의 Function을 사용하는지 알 수 있기 때문입니다.

 

 

그러나 아래의 코드는 Function 멤버를 Inline화 할 수 없습니다.

struct Base

{

    virtual void Function(void) const = 0:

};

 

struct Delived:  public Base

{

    virtual void Function(void) const

    {

         std::cout << "Hello" << std::endl;

    }

};

 

struct Null  : public Base

{

    virtual void Function(void) const{}

};

 

int main( int argc, char** )

{

    Delived   delived;

    Null        null;

   

    Base  *base = 1 < argc ? static_cast<Base*>( &delived ) : static_cast<Base*>( &null );

     base->Function();

 

    return 0;

}

이유는 설명 안 해도 되겠죠? ^^

 

 

 

출처 : http://d.hatena.ne.jp/anonymouse_user/20120309/1331303971

 

 

 

저작자 표시
신고
by 흥배 2012.04.18 09:00
왠지 프로그래머 입사 시험에 나올만한 문제를 발견해서 소개합니다.
길이는 짧으면서 약간 알쏭달쏭해서 낚이는 분들도 있지 않을까 생각합니다^^;;

그럼 문제입니다.

class Base
{
public :
    virtual void f() { }
} ;

class Derived : public Base
{
private :
    void f() { }
} ;

int main()
{
    Derived d ;
    d.f();   // 1. ?

    Base & ref = d ;
    ref.f();  // 2. ?

    return 0;
}

위 코드를 컴파일하면 결과는 어떻게 나올까요?
1과 2에서 둘 다 에러가 나올까요? 아니면 둘 중 하나라면 어떤 것에서 에러가 나올까요?





(아래 부분을 마우스로 선택해 보세요 ^^;)
1번은 에러가 됩니다.
2번 virtual 함수의 접근 조사는 호출 시점에서의 선언에 의해 정적으로 결정됩니다. 그래서 main()에서 Base::f로는 접근할 수 있으므로  ref.f()는 에러가 되지 않으며 virtual 함수 호출에 의해 Derived의 f를 호출합니다.



출처 : http://cpplover.blogspot.com/2011/01/c.html




저작자 표시
신고
by 흥배 2011.02.23 09:00
| 1 |

티스토리 툴바