그래서 다음과 같은 수업이 있습니다.
class Base {
public:
Base() {cout << "made a base" << endl;}
virtual void getType() const { cout << "Im a base" << endl;
virtual ~Base() {}
//other members...
}
class Derived: public Base {
public:
Derived() {cout << "made a derived" << endl;
virtual void getType() const { cout << "Im a derived" << endl; }
virtual ~Derived() {}
//other memebrs...
}
int main() {
Base* test = new Derived();
test->getType();
return 0;
}
산출:
made a base
made a derived
Im a derived
지금은 출력 것을 알고 Im a derived
있지만 나는 그것은 올바른 함수를 호출 할 수있는 방법이 Vftables 내부적으로 어떻게 작동하는지 알고 싶습니다 때문에 다형성의 VTABLE 내부의 test
기본 클래스로 점 getType()
때문에 유형의 기능 test
그래서 어떻게 그것을 할 수 그것이 알고 Derived::getType()
하지 Base::getType()
가이 선언의 볼 때 내 프로그램이 실행시에합니까 무엇을 말해 .IN test->getType()
?
미리 감사드립니다.
당신이 할 때 Base* test = new Derived()
:
객체의 V-Table 포인터 test
는 클래스의 V-Table을 가리 키도록 설정됩니다 Derived
.
객체를 통해 생성 될 때 new Derived()
클래스 Derived
가 아닌 클래스의 함수 (생성자)를 명시 적으로 호출하는 것 Base
입니다.
그리고이 함수가 호출되면 새로운 객체의 v-table 포인터가 class Derived
가 아닌 class의 V-Table을 가리 키도록 설정합니다 Base
.
두 클래스의 실제 V- 테이블 인 AFAIK는 링커의 과거 컴파일에 의해 생성됩니다.
보충 :
프로그램은 함수가임을 "알 필요가 없습니다" virtual
.
비가 상 함수 호출의 경우 컴파일러는 상수 주소 (즉, 컴파일 중에 확인할 수있는 비가 상 함수의 주소)에 JUMP 명령어를 추가합니다.
가상 함수 호출의 경우 컴파일러는 런타임 중에 만 값이 확인되는 변수에 저장된 (가 가리키는) 주소에 JUMP 명령어를 추가합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다