다음 샘플 코드가 있으며 CBar 클래스의 Pass 메서드에 액세스하는 올바른 방법을 알고 싶습니다. 현재 나는이 방법에 대한 액세스를 얻을 수있는 3 가지 방법을 발견하고 그들은 다음과 같습니다상속 된 클래스에서 숨기는 이름
- 개체를 캐스팅, ((CBAR *) & foo에) -> 패스 (1, 2, 3);
- 이 구문을 사용하면 foo.CBar :: Pass (1,2,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
'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++ 언어 스펙에 따르면 "올바르게 작동합니다.") –
'((CBar) foo) .Pass()'를 사용하지 않는 이유는 무엇입니까? – texasbruce
@texasbruce : 이것은 'CBar' 타입의 분리 된 임시 객체를 생성하고 임시 메소드를 호출 할 것이기 때문입니다. OP는 임시로 전화를 걸고 싶지 않습니다. OP는 특별히 foo 메소드를 호출하려고합니다.그 때문에 그는'((CBar &) foo) .Pass()'를 할 수는 있지만 여러분이 제안한 것은 할 수 없습니다. – AnT