나는 두 개의 클래스 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()
여기서 내가 뭘 잘못하고 있는지, 어떻게 메소드에 액세스해야합니까?
표준 C ++에서는 가상 테이블에 액세스 할 수 없습니다. 사실, 언어에는 가상 테이블이 무엇인지에 대한 개념조차 없습니다. 가상 테이블은 동적 디스패치를 구현하는 특정 (그리고 널리 사용되는) 방법입니다.
내가 여기서 뭘 잘못하고 있니?
를 통해 간접적으로 사용 vptr
하면 프로그램의 동작이 정의되지 않습니다.
일부 구현에는 C ++로 테이블에 액세스하는 방법이있을 수 있지만 표준 방법은 없습니다. 컴파일러가 그렇지 않은 경우 유일한 방법은 컴파일러가이를 구현하는 방법을 연구하고 어셈블리에서 액세스하도록 프로그램을 작성하는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다