나는 수업이 B
에서 파생를 A
이라는 멤버 어디 type
내가 클래스의 방법에서 액세스 할 B
대신 실제 값의 난을 얻을 수 0
있지만 캐스팅 경우 this
에 A
내부 B
방법은 다음과 같이 잘 작동합니다 : ((A*)this)->type
그것은 나에게 실제를주고 그래서 값 대신 0
. 누군가 그것을 설명 할 수 있습니까? 코드 예제를 제공하기 위해 실제 수업의 짧은 버전을 작성했습니다.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
enum TYPE
{
T_INTEGER = 2,
T_FLOAT = 4
};
struct A
{
enum TYPE type;
A(enum TYPE);
A();
int print();
};
struct B : A
{
enum TYPE type;
B(enum TYPE);
};
struct Number : B
{
union
{
int intvalue;
float floatvalue;
};
Number(int);
int print();
};
A::A() { }
A::A(enum TYPE Type)
: type(Type)
{
}
B::B(enum TYPE kind) :
A(kind)
{
}
Number::Number(int v)
: B(T_INTEGER),
intvalue(v)
{
}
int Number::print()
{
printf("type = %d\n", type); // output: type = 0 (wrong)
printf("type = %d\n", ((A*)this)->type); // output type = 2 (correct) but why do I need cast?
switch(((A*)this)->type)
{
case T_INTEGER:
return printf("%d", intvalue);
case T_FLOAT:
return printf("%g", floatvalue);
default:
assert(0);
}
}
int main()
{
Number *n = new Number(2);
n->print();
delete n;
}
멤버 변수를 선언했습니다.
enum TYPE type;
클래스 모두에서 B
하고 A
있지만 B
생성자는 결코 그 초기화한다없는 자신의 그 이름을 가진 변수가 - 그것은 단지로 전달 A
하는 처음 상태 생성자A::type
B::B(enum TYPE kind) :
A(kind)
{
}
따라서 B
멤버는 초기화되지 않습니다. 파생 클래스에 같은 이름과 유형의 변수를 다시 추가 한 이유는 분명 B
하지 않지만 아마도 당신이 이것을 의도하지 않았고 오히려 기본 클래스 에서이 유형의 단일 변수를 원한다는 것입니다.A
파생 클래스와 기본 클래스 모두에서 동일한 변수 이름과 유형을 가진이 상황이 발생하면 파생 클래스 멤버가 기본 클래스 멤버를 섀도 잉합니다. 이것이 메서드 type
에서 액세스 Number::print()
하는 것이 B
멤버가 아닌 멤버를 참조하는 이유 A
입니다. 분명히 그런 다음 캐스팅 하여 구성원 this
에 A*
액세스합니다 A::type
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다