2013-10-29 2 views
1

다음 샘플 코드가 있으며 CBar 클래스의 Pass 메서드에 액세스하는 올바른 방법을 알고 싶습니다. 현재 나는이 방법에 대한 액세스를 얻을 수있는 3 가지 방법을 발견하고 그들은 다음과 같습니다상속 된 클래스에서 숨기는 이름

  1. 개체를 캐스팅, ((CBAR *) & foo에) -> 패스 (1, 2, 3);
  2. 이 구문을 사용하면 foo.CBar :: Pass (1,2,3);
  3. CBar :: Pass를 사용하여 CFoo 클래스 선언에서 "using"구문을 사용하십시오.

다음은이 기능을 테스트하는 간단한 프로젝트의 예입니다. Foo.h

#include "bar.h" 
class CFoo : 
    public CBar 
{ 
private: 
    double m_a; 
    double m_b; 
public: 
    CFoo(void); 
    ~CFoo(void); 

    void Pass(double a, double b); 
}; 

foo.cpp에

#include "Foo.h" 
CFoo::CFoo(void) 
{ 
    m_a = 0.0; 
    m_b = 0.0; 
} 
CFoo::~CFoo(void) 
{ 
} 

void CFoo::Pass(double a, double b) 
{ 
    m_a = a; 
    m_b = b; 
} 

Bar.h

class CBar 
{ 
    int m_x; 
    int m_y; 
    int m_z; 
public: 
CBar(void); 
~CBar(void); 

void Pass(int x, int y, int z); 
}; 

Bar.cpp

#include "Bar.h" 

CBar::CBar(void) 
{ 
    m_x = 0; 
    m_y = 0; 
    m_z = 0; 
} 

CBar::~CBar(void) 
{ 
} 

void CBar::Pass(int x, int y, int z) 
{ 
    m_x = x; 
    m_y = y; 
    m_z = z; 
} 

그리고 내 메인 클래스 DoStuff.cpp

#include "DoStuff.h" 
#include "Foo.h" 

CDoStuff::CDoStuff(void) 
{ 
} 

CDoStuff::~CDoStuff(void) 
{ 
} 

int main() 
{ 
    CFoo foo, foo1, foo2; 

    //This only gets to the Pass method in Foo. 
    foo.Pass(2.5, 3.5); 

    //Gets access to Pass method in Bar. 
    foo1.CBar::Pass(5,10,15); 

    //Can also case and access by location for the same result?? 
    ((CBar *) &foo2)->Pass(100,200,300); 

    return 0; 
} 

은 각 옵션은 가능한 있습니까? 어떤 사람이 선호됩니까? 나열된 방법 중 하나를 사용하여 함정이 있습니까?

특히 foo.CBar :: Pass (1,2,3) 구문에 대해 궁금합니다.

덕분에 이러한 특정 실시 예에서

B

+0

'CBar :: Pass()'를 호출하려면'foo.CBar :: Pass (1,2,3)'를 사용하십시오. 'Pass()'가 가상이고'CFoo'에서 재정의되면''((CBar *) & foo2) -> Pass (100,200,300);을 사용하면 제대로 작동하지 않을 것입니다. - 그러나 당신은'CBar :: Pass (double, double, double)'선언을 virtual로 선언 할 수 있고 또한 두 번째로 오버로드 된'CFoo :: Pass (double, double, double)'을 가질 수 있으며, - "작업"에 의해 "실행"CBar :: Pass()' "를 의미하는 경우. (물론, C++ 언어 스펙에 따르면 "올바르게 작동합니다.") –

+0

'((CBar) foo) .Pass()'를 사용하지 않는 이유는 무엇입니까? – texasbruce

+1

@texasbruce : 이것은 'CBar' 타입의 분리 된 임시 객체를 생성하고 임시 메소드를 호출 할 것이기 때문입니다. OP는 임시로 전화를 걸고 싶지 않습니다. OP는 특별히 foo 메소드를 호출하려고합니다.그 때문에 그는'((CBar &) foo) .Pass()'를 할 수는 있지만 여러분이 제안한 것은 할 수 없습니다. – AnT

답변

2

모든 방법은 궁극적으로 동일한 결과를 생성한다.

일반적으로 결과가 다를 수 있습니다.

Pass이 가상 기능인 경우 "캐스트"방법 ((CBar *) &foo)->Pass(1, 2, 3);은 통화의 동적 특성을 보존합니다. 형변환은 참조 유형, BTW, ((CBar &) foo).Pass(1, 2, 3);의 측면에서 수행 할 수 있습니다. 그리고 이러한 상황에서 C++ 스타일 캐스트를 사용하는 것이 더 좋은 아이디어입니다.

Pass이 가상 함수 인 경우 CBar::Pass을 보장하는 경우 '한정 이름'메소드 foo.CBar::Pass(1,2,3);은 통화의 동적 특성을 억제합니다.

관련 문제