C ++에서 가상 테이블을 통해 함수에 액세스

나는 두 개의 클래스 B와 D가 있습니다

class B{
public:
  virtual int prva()=0;
  virtual int druga(int)=0;
};

class D: public B{
public:
  virtual int prva(){return 42;}
  virtual int druga(int x){return prva()+x;}
};

내 임무는 객체 B에 대한 포인터를 가져 오는 함수를 만들고 이름을 사용하지 않고 'prva'및 'druga'메소드의 값을 반환하는 인쇄 (가상 테이블을 통해 액세스)

'prva'메소드의 반환 값을 성공적으로 인쇄하는 다음 코드를 작성했지만 두 번째 메소드 'druga'에 대해 동일한 작업을 수행하지 못했습니다.

typedef int (*PTRFUN1)(void);
typedef int (*PTRFUN2)(int);

void function (B* var){
    int* vptr =  *(int**)var;
    PTRFUN1 fun1 = (PTRFUN1)vptr[0];
    PTRFUN2 fun2 = (PTRFUN2)vptr[1];
    pprintf("Prva:%d\n", fun1());
    printf("Druga:%d\n", fun2(2));
}

int main(void){
    B *pb = new D();
    function(pb);
}

이 코드는 인쇄를 실행합니다. "Prva : 42"

prva()'드루가'내부 를 호출 하지 못하고 이유를 알 수 없습니다.

또한 단순히 호출을 제거 prva()하고 본문을 그대로 return x두면 메서드 'druga'는 항상 "42"를 반환하거나 어떤 인수를 통해 보내려고해도 'prva'가 반환하도록 한 숫자를 반환합니다.fun2()

여기서 내가 뭘 잘못하고 있는지, 어떻게 메소드에 액세스해야합니까?

Eerorika

표준 C ++에서는 가상 테이블에 액세스 할 수 없습니다. 사실, 언어에는 가상 테이블이 무엇인지에 대한 개념조차 없습니다. 가상 테이블은 동적 디스패치를 ​​구현하는 특정 (그리고 널리 사용되는) 방법입니다.

내가 여기서 뭘 잘못하고 있니?

를 통해 간접적으로 사용 vptr하면 프로그램의 동작이 정의되지 않습니다.

일부 구현에는 C ++로 테이블에 액세스하는 방법이있을 수 있지만 표준 방법은 없습니다. 컴파일러가 그렇지 않은 경우 유일한 방법은 컴파일러가이를 구현하는 방법을 연구하고 어셈블리에서 액세스하도록 프로그램을 작성하는 것입니다.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

특정 테이블을 통해 관련 개체에 액세스

분류에서Dev

이름을 통해 iOS SDK 상수에 액세스 (반사)

분류에서Dev

Lua 래퍼를 통해 C ++ 클래스 상태에 액세스하면 가비지 값이 생성됩니다.

분류에서Dev

버튼을 통해 상위 위젯의 변수에 액세스

분류에서Dev

Elasticsearch 2.3을 통해 외부 IP에서 액세스 가능

분류에서Dev

bash에서 읽기 명령을 통해 둘 이상의 파일에 액세스

분류에서Dev

접속 테이블을 통해 SQL 필터링 레코드에 액세스

분류에서Dev

"이름"을 가진 테이블에서 루아 함수에 액세스 할 수없는 이유

분류에서Dev

상태 해결 함수에서 반환 된 데이터에 액세스

분류에서Dev

명령 줄을 통해 액세스 수준에 TFS 서버 그룹 추가

분류에서Dev

명령 줄을 통해 액세스 수준에 TFS 서버 그룹 추가

분류에서Dev

컬렉션을 통해 hasMany 관계 함수에 액세스

분류에서Dev

Windows 7 : 다른 컴퓨터에서 LAN을 통해 액세스 한 내 c : \의 로그가 있습니까?

분류에서Dev

Managed Identity C #을 통해 AzureBlobStorage에 액세스

분류에서Dev

테이블을 통해 다른 테이블에 액세스하는 ASP.net MVC의 Linq 쿼리

분류에서Dev

C ++ 함수 객체 클래스를 통해 매개 변수에 액세스

분류에서Dev

PHP에서 COM을 통해 .NET 어셈블리에 액세스

분류에서Dev

PowerShell을 통해 폴더 / 파일에서 상속 된 액세스 규칙 제거

분류에서Dev

가상 버튼을 통해 이미지 대상 외부의 개체에 액세스합니까?

분류에서Dev

Ruby : 탭을 통해 값에 액세스

분류에서Dev

OpenSSL을 통해 IMAP에 액세스

분류에서Dev

Python을 통해 Indeed에 액세스

분류에서Dev

테이블 필드에서 2013 증가 수량에 액세스

분류에서Dev

내 C # 애플리케이션을 통해서만 PHP 파일에 액세스 할 수 있도록합니까?

분류에서Dev

외부 및 상속 C ++를 통해 정적 멤버에 액세스

분류에서Dev

C # 애플리케이션을 통해 Siemens S7-1200에 액세스

분류에서Dev

함수의 Powershell 해시 테이블에 액세스 할 수 없음

분류에서Dev

가능한 조각을 통해 활동의 AndroidViewModel에 액세스 할 수?

분류에서Dev

EWS 관리 API C #을 통해 리소스 캘린더에 액세스

Related 관련 기사

  1. 1

    특정 테이블을 통해 관련 개체에 액세스

  2. 2

    이름을 통해 iOS SDK 상수에 액세스 (반사)

  3. 3

    Lua 래퍼를 통해 C ++ 클래스 상태에 액세스하면 가비지 값이 생성됩니다.

  4. 4

    버튼을 통해 상위 위젯의 변수에 액세스

  5. 5

    Elasticsearch 2.3을 통해 외부 IP에서 액세스 가능

  6. 6

    bash에서 읽기 명령을 통해 둘 이상의 파일에 액세스

  7. 7

    접속 테이블을 통해 SQL 필터링 레코드에 액세스

  8. 8

    "이름"을 가진 테이블에서 루아 함수에 액세스 할 수없는 이유

  9. 9

    상태 해결 함수에서 반환 된 데이터에 액세스

  10. 10

    명령 줄을 통해 액세스 수준에 TFS 서버 그룹 추가

  11. 11

    명령 줄을 통해 액세스 수준에 TFS 서버 그룹 추가

  12. 12

    컬렉션을 통해 hasMany 관계 함수에 액세스

  13. 13

    Windows 7 : 다른 컴퓨터에서 LAN을 통해 액세스 한 내 c : \의 로그가 있습니까?

  14. 14

    Managed Identity C #을 통해 AzureBlobStorage에 액세스

  15. 15

    테이블을 통해 다른 테이블에 액세스하는 ASP.net MVC의 Linq 쿼리

  16. 16

    C ++ 함수 객체 클래스를 통해 매개 변수에 액세스

  17. 17

    PHP에서 COM을 통해 .NET 어셈블리에 액세스

  18. 18

    PowerShell을 통해 폴더 / 파일에서 상속 된 액세스 규칙 제거

  19. 19

    가상 버튼을 통해 이미지 대상 외부의 개체에 액세스합니까?

  20. 20

    Ruby : 탭을 통해 값에 액세스

  21. 21

    OpenSSL을 통해 IMAP에 액세스

  22. 22

    Python을 통해 Indeed에 액세스

  23. 23

    테이블 필드에서 2013 증가 수량에 액세스

  24. 24

    내 C # 애플리케이션을 통해서만 PHP 파일에 액세스 할 수 있도록합니까?

  25. 25

    외부 및 상속 C ++를 통해 정적 멤버에 액세스

  26. 26

    C # 애플리케이션을 통해 Siemens S7-1200에 액세스

  27. 27

    함수의 Powershell 해시 테이블에 액세스 할 수 없음

  28. 28

    가능한 조각을 통해 활동의 AndroidViewModel에 액세스 할 수?

  29. 29

    EWS 관리 API C #을 통해 리소스 캘린더에 액세스

뜨겁다태그

보관