파생 클래스를 기본 클래스 포인터에 할당 할 때만 기본 클래스 함수를 호출 할 수있는 원리를 이해합니다. 가상 테이블에 대한 나의 이해에서 기본 테이블 가상 함수 포인터 만 가상 테이블에 넣을 수 있기 때문에 이유는 무엇입니까?하지만 기본 클래스 포인터가 파생 클래스를 가리키는 경우 파생 클래스 생성자가 기본 클래스 가상 함수는 가상 테이블에서 재정의로 대체됩니다.기본 클래스 포인터에 의해 호출되는 재정의 된 가상 함수 내에서 파생 클래스 특정 함수
그러나 요점은 : 가상 기본 클래스 멤버 함수의 파생 클래스 재정의에 사용되는 파생 클래스의 가상 멤버 함수가 아닌 경우 문제가 발생하는지 여부입니다.
필자의 이론에서는 함수 액세스가 함수 내에서 점프하지 않기 때문에 포인터를 새 DerivedClass에 할당하여 모든 파생 클래스에 공간을 할당하므로 가상 대체 함수에 대한 액세스가 v 테이블에 보관 된 가상 함수에 대한 포인터를 사용하여 허용됩니다. 이후의 모든 액션은 마치 파생 클래스 객체에있는 것처럼 동작하므로 원하는 모든 함수로 이동할 수 있습니다.
이 정보가 맞습니까? 아니면 기본 클래스 포인터를 점프 참조 (배열 : * 포인터 + 2 함수)에 대한 함수에서 점프와 함께 문제가있다, 그 멤버 함수를 호출하는 방법입니다?
이것이 내 의도는 아니지만 여전히 문제가되지 않는다면 이론적으로 int 인수를 취하는 가상 함수를 가질 수 있습니다. 그런 다음 파생 클래스 내부의 switch 문은 전달 된 int에 따라 특정 파생 클래스 함수를 호출하여 '가상 함수 만 정의 된 기본 클래스 호출'문제를 해결하는 가상 함수를 재정의합니다.
예 : 나는이 좋은 이론적 유지 한 이유는 현재 설계 단계에서 (어떤 생성자 등을 선언/정의의 분리와 골격)
class A
{
protected:
virtual void AFunc() ;
} ;
class B : public A
{
public:
virtual void AFunc() { BSpecificFunc() ;} // doable?
/* if thats the case why not:
virtual void Sfunv(int temp)
{
switch(temp)
{
case 1 : BSpecificFunca() ; break;
case 2: BSpecificFuncb() ; break;
etc.
}
}
*/
private:
void BSpecificFunc() ;
void BSpecificFunca() ;
void BSpecificFuncb() ;
void BSpecificFuncc() ;
} ;
int main()
{
A *pBaseClass = new B;
pBaseClass->AFunc(); //Will there be any issues doing this?
}
.
을이 작은을 컴파일 할 아주 간단해야한다. 테스트 프로그램을 실행하고 무슨 일이 일어 나는지 확인하십시오! – krsteeve
AFunc()와 같이 호출 할 수 없습니다. B의 일부이며 독립 실행 형 함수가 아닙니다. –
수정을 위해 편집 됨 'claptrap' – user2248685