2013-08-01 4 views
0

파생 클래스를 기본 클래스 포인터에 할당 할 때만 기본 클래스 함수를 호출 할 수있는 원리를 이해합니다. 가상 테이블에 대한 나의 이해에서 기본 테이블 가상 함수 포인터 만 가상 테이블에 넣을 수 있기 때문에 이유는 무엇입니까?하지만 기본 클래스 포인터가 파생 클래스를 가리키는 경우 파생 클래스 생성자가 기본 클래스 가상 함수는 가상 테이블에서 재정의로 대체됩니다.기본 클래스 포인터에 의해 호출되는 재정의 된 가상 함수 내에서 파생 클래스 특정 함수

그러나 요점은 : 가상 기본 클래스 멤버 함수의 파생 클래스 재정의에 사용되는 파생 클래스의 가상 멤버 함수가 아닌 경우 문제가 발생하는지 여부입니다.

필자의 이론에서는 함수 액세스가 함수 내에서 점프하지 않기 때문에 포인터를 새 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? 

} 

.

+0

을이 작은을 컴파일 할 아주 간단해야한다. 테스트 프로그램을 실행하고 무슨 일이 일어 나는지 확인하십시오! – krsteeve

+0

AFunc()와 같이 호출 할 수 없습니다. B의 일부이며 독립 실행 형 함수가 아닙니다. –

+0

수정을 위해 편집 됨 'claptrap' – user2248685

답변

1

pBaseClass->AFunc()pBaseClass으로 전화하면 실제로는 B이며 B::AFunc()은 호출됩니다. pBaseClass이 실제로 A 인 경우 A::AFunc()이 호출됩니다. 그것이 다형성의 핵심입니다. B::AFunc()이 무엇

B에 달려있다, A에 존재하지 않는이 B 내에서 다른 기능 또는 사용 데이터를 호출 할 수 없습니다 이유가 없습니다.

0

문제가 없어야합니다. 가상이 아닌 기능에 대한 호출이 이미 해결되었습니다. 이런 식으로 생각하십시오 : B::AFunc()call BSpecificFunc과 같은 것으로 컴파일됩니다. 컴파일 할 때 수행 할 수 있습니다.

유일한 문제는 B::AFunc()에 도착하는 것입니다. 가상 테이블이 있다는 것입니다. 우리가 거기하지만 일단 - 문제가 없는지, 객체 포인터는 실제로 BSpecificFunc에 대한 유효한 B 객체 (가리키는 및 BSpecificFunction에 함수 호출은 이미 해결

관련 문제