2011-04-10 8 views
8

은 다음과 같은 간단한 경우를 가정의 모든 후손에게 상속 "가상"이다C는 ++ :

class A { 
    virtual void func(); 
}; 

class B : public A { 
    void func(); 
}; 

class C : public B { 
    void func(); 
}; 

(가상의 위치를 ​​알)겠습니까 다음과 같은 호출 전화 B::func() 또는 C::func()?

B* ptr_b = new C(); 
ptr_b->func(); 
+2

예, 가상 차종 등의 방법을 선언 모든 자손 가상 – knittl

답변

6

예를하는 데 도움이됩니다. 기준을 사용하여 포인터

B *pB = new C(); 
pB->func(); //calls C::func() 

A *pA = new C(); 
pA->func(); //calls C::func() 
  • 사용

    • . 마지막 호출에 주목하십시오 : 가장 중요한 호출입니다.

      C c; 
      B & b = c; 
      b.func(); //calls C::func() 
      
      //IMPORTANT - using reference! 
      A & a = b; 
      a.func(); //calls C::func(), not B::func() 
      

    온라인 데모 : http://ideone.com/fdpU7

  • 7
    1. 코드는 ++ 무효 C입니다. 클래스 정의에서 괄호는 무엇입니까?
    2. pointer_to_b_type이 가리키는 개체의 동적 유형에 따라 다릅니다.
    3. 당신이 무엇을 이해한다면 정말로가 물어보고 싶은데, 그렇다면 '예'. 이 C::func 호출

      C c; 
      B* p = &c; 
      p->func(); 
      
    +0

    @Amir : 그 예/아니오 질문을하지 않습니다. – Nawaz

    +0

    @Amir : "모든"자손에게 "상속 된"가상 "은 나에게 예/아니오 질문처럼 들립니다. – Xeo

    +0

    @Amir : 정말요? 나는 항상 "..."과 "..."과 같은 형태의 질문은 예/아니오 질문이라고 생각했습니다. – ybungalobill

    3

    그것은 당신이 참조하고있는 클래스의 함수를 호출합니다. 그러나 그것이 존재하지 않는다면 그것은 작동합니다.

    다음 코드를보십시오 :

    #include <iostream> 
    using namespace std; 
    
    class A { 
        public: 
        virtual void func() { cout << "Hi from A!" << endl; } 
    }; 
    
    class B : public A { 
        public: 
        void func() { cout << "Hi from B!" << endl; } 
    }; 
    
    class C : public B { 
        public: 
        void func() { cout << "Hi from C!" << endl; } 
    }; 
    
    int main() { 
        B* b_object = new C; 
        b_object->func(); 
        return 0; 
    } 
    

    희망이 참조뿐만 아니라 포인터를 사용

    +0

    죄송합니다. 나는 그 사실을 완전히 잊었습니다. 수정 됨. 내 대답은 아직 멈춘다;) –

    +0

    그래, 이제 괜찮아. – Xeo