기본 클래스에서 실제 값에 액세스하기 위해 캐스트가 필요한 이유는 무엇입니까?

마스크

나는 수업이 B에서 파생를 A이라는 멤버 어디 type내가 클래스의 방법에서 액세스 할 B대신 실제 값의 난을 얻을 수 0있지만 캐스팅 경우 thisA내부 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;
}
수학자 1975

멤버 변수를 선언했습니다.

enum TYPE type;

클래스 모두에서 B 하고 A 있지만 B생성자는 결코 그 초기화한다없는 자신의 그 이름을 가진 변수가 - 그것은 단지로 전달 A하는 처음 상태 생성자A::type

B::B(enum TYPE kind) :
   A(kind)
{
}

따라서 B멤버는 초기화되지 않습니다. 파생 클래스에 같은 이름과 유형의 변수를 다시 추가 한 이유는 분명 B하지 않지만 아마도 당신이 이것을 의도하지 않았고 오히려 기본 클래스 에서이 유형의 단일 변수를 원한다는 것입니다.A

파생 클래스와 기본 클래스 모두에서 동일한 변수 이름과 유형을 가진이 상황이 발생하면 파생 클래스 멤버가 기본 클래스 멤버를 섀도 잉합니다. 이것이 메서드 type에서 액세스 Number::print()하는 것이 B멤버가 아닌 멤버를 참조하는 이유 A입니다. 분명히 그런 다음 캐스팅 하여 구성원 thisA*액세스합니다 A::type.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Chrome에서 기본 브라우저로 설정하기 위해 관리자 액세스 권한이 필요한 이유는 무엇입니까?

분류에서Dev

마지막 배열 요소에 액세스하기 위해 비트 현명한 연산자가 필요한 이유는 무엇입니까?

분류에서Dev

www-data가 디렉토리에 업로드 된 파일을 쓰기 위해 실행 액세스 권한이 필요한 이유는 무엇입니까?

분류에서Dev

c ++ : 클래스 함수에 액세스하기 위해 유형의 cv 한정자를 제거하는 방법은 무엇입니까?

분류에서Dev

"ls"를 실행하기 위해 별도의 프로세스가 필요한 이유는 무엇입니까?

분류에서Dev

기본 클래스에서 자식 클래스의 필드 / 변수에 액세스하는 방법이 있습니까? 이해가 되나요?

분류에서Dev

루트 액세스 및 SSH 키 기반 인증을 위해 sudo가 필요한 시스템에서 SFTP를 사용하는 방법은 무엇입니까?

분류에서Dev

루트 액세스 및 SSH 키 기반 인증을 위해 sudo가 필요한 시스템에서 SFTP를 사용하는 방법은 무엇입니까?

분류에서Dev

실제 인스턴스에 액세스하기 위해 Jmockit 1.1에서 1.9로 코드를 업데이트하는 방법은 무엇입니까?

분류에서Dev

파생 클래스에서 액세스하기 위해 추상 클래스에서 필드를 "공용"으로 선언해야하는 이유는 무엇입니까?

분류에서Dev

맵의 값에 액세스하기 위해 'this'를 사용해야하는 이유는 무엇입니까?

분류에서Dev

선택한 패키지에서 Java 클래스를 가져 오기 위해 ajax 호출을 실행하지 않는 이유는 무엇입니까?

분류에서Dev

클라이언트가 여러 대상에 액세스하기 위해 토큰이 필요할 때 JWT를 생성하는 방법은 무엇입니까?

분류에서Dev

다운 캐스팅 후 기본 클래스 메서드에 액세스하는 방법은 무엇입니까?

분류에서Dev

BoundServices에 액세스하기 위해 바인더 클래스를 상속하는 다른 클래스를 사용하는 이유는 무엇입니까?

분류에서Dev

다른 클래스에서 참조하는 클래스에 대해 가져 오기가 필요하지 않은 이유는 무엇입니까?

분류에서Dev

읽기 액세스를 위해 IRQ 안전 버전의 seqlock이 필요한 이유는 무엇입니까?

분류에서Dev

Typescript에서 유형 캐스트가 필요한 이유는 무엇입니까?

분류에서Dev

컨트롤러 작업에 대한 액세스를 제어하기 위해 RBAC 사용 규칙을 추가하는 방법은 무엇입니까?

분류에서Dev

C #에서 하위 클래스 필드의 기본값이 수퍼 클래스 필드의 기본값을 재정의하지 않는 이유는 무엇입니까?

분류에서Dev

새로운 프로세스를 생성하기 위해 포크가 필요한 이유는 무엇입니까?

분류에서Dev

Jest가 비동기 코드를 테스트하기 위해 Babel이 필요한 이유는 무엇입니까?

분류에서Dev

super ()를 사용하여 기본 클래스 생성자에 액세스해야하는 이유는 무엇입니까?

분류에서Dev

g ++에 C ++에서 반복기 값을 인쇄하기 위해 -fpermissive 플래그가 필요한 이유는 무엇입니까?

분류에서Dev

g ++에 C ++에서 반복기 값을 인쇄하기 위해 -fpermissive 플래그가 필요한 이유는 무엇입니까?

분류에서Dev

기본 클래스에서 비공개 변수에 액세스하는 방법은 무엇입니까?

분류에서Dev

삼항 연산자에서 정수 리터럴을 축약하기 위해 명시 적 캐스팅이 필요한 이유는 무엇입니까?

분류에서Dev

`getNoise`에 대한이 호출이 하위 클래스 구현이 아닌 기본 클래스 구현을 사용하는 이유는 무엇입니까?

분류에서Dev

Unity의 잡 시스템에서 반환 값을 얻기 위해 NativeArray가 필요한 이유는 무엇입니까?

Related 관련 기사

  1. 1

    Chrome에서 기본 브라우저로 설정하기 위해 관리자 액세스 권한이 필요한 이유는 무엇입니까?

  2. 2

    마지막 배열 요소에 액세스하기 위해 비트 현명한 연산자가 필요한 이유는 무엇입니까?

  3. 3

    www-data가 디렉토리에 업로드 된 파일을 쓰기 위해 실행 액세스 권한이 필요한 이유는 무엇입니까?

  4. 4

    c ++ : 클래스 함수에 액세스하기 위해 유형의 cv 한정자를 제거하는 방법은 무엇입니까?

  5. 5

    "ls"를 실행하기 위해 별도의 프로세스가 필요한 이유는 무엇입니까?

  6. 6

    기본 클래스에서 자식 클래스의 필드 / 변수에 액세스하는 방법이 있습니까? 이해가 되나요?

  7. 7

    루트 액세스 및 SSH 키 기반 인증을 위해 sudo가 필요한 시스템에서 SFTP를 사용하는 방법은 무엇입니까?

  8. 8

    루트 액세스 및 SSH 키 기반 인증을 위해 sudo가 필요한 시스템에서 SFTP를 사용하는 방법은 무엇입니까?

  9. 9

    실제 인스턴스에 액세스하기 위해 Jmockit 1.1에서 1.9로 코드를 업데이트하는 방법은 무엇입니까?

  10. 10

    파생 클래스에서 액세스하기 위해 추상 클래스에서 필드를 "공용"으로 선언해야하는 이유는 무엇입니까?

  11. 11

    맵의 값에 액세스하기 위해 'this'를 사용해야하는 이유는 무엇입니까?

  12. 12

    선택한 패키지에서 Java 클래스를 가져 오기 위해 ajax 호출을 실행하지 않는 이유는 무엇입니까?

  13. 13

    클라이언트가 여러 대상에 액세스하기 위해 토큰이 필요할 때 JWT를 생성하는 방법은 무엇입니까?

  14. 14

    다운 캐스팅 후 기본 클래스 메서드에 액세스하는 방법은 무엇입니까?

  15. 15

    BoundServices에 액세스하기 위해 바인더 클래스를 상속하는 다른 클래스를 사용하는 이유는 무엇입니까?

  16. 16

    다른 클래스에서 참조하는 클래스에 대해 가져 오기가 필요하지 않은 이유는 무엇입니까?

  17. 17

    읽기 액세스를 위해 IRQ 안전 버전의 seqlock이 필요한 이유는 무엇입니까?

  18. 18

    Typescript에서 유형 캐스트가 필요한 이유는 무엇입니까?

  19. 19

    컨트롤러 작업에 대한 액세스를 제어하기 위해 RBAC 사용 규칙을 추가하는 방법은 무엇입니까?

  20. 20

    C #에서 하위 클래스 필드의 기본값이 수퍼 클래스 필드의 기본값을 재정의하지 않는 이유는 무엇입니까?

  21. 21

    새로운 프로세스를 생성하기 위해 포크가 필요한 이유는 무엇입니까?

  22. 22

    Jest가 비동기 코드를 테스트하기 위해 Babel이 필요한 이유는 무엇입니까?

  23. 23

    super ()를 사용하여 기본 클래스 생성자에 액세스해야하는 이유는 무엇입니까?

  24. 24

    g ++에 C ++에서 반복기 값을 인쇄하기 위해 -fpermissive 플래그가 필요한 이유는 무엇입니까?

  25. 25

    g ++에 C ++에서 반복기 값을 인쇄하기 위해 -fpermissive 플래그가 필요한 이유는 무엇입니까?

  26. 26

    기본 클래스에서 비공개 변수에 액세스하는 방법은 무엇입니까?

  27. 27

    삼항 연산자에서 정수 리터럴을 축약하기 위해 명시 적 캐스팅이 필요한 이유는 무엇입니까?

  28. 28

    `getNoise`에 대한이 호출이 하위 클래스 구현이 아닌 기본 클래스 구현을 사용하는 이유는 무엇입니까?

  29. 29

    Unity의 잡 시스템에서 반환 값을 얻기 위해 NativeArray가 필요한 이유는 무엇입니까?

뜨겁다태그

보관