2013-01-20 6 views
4
class subscriber 
{ 
public: 
     virtual void update() = 0; 
} 

class entity : public subsriber 
{ 
public: 
     virtual void update() = 0; 
} 

class myObject : public entity 
{ 
public: 
     virtual void update() 
     { 
     do_things(); 
     } 
} 

subscriber * ptr = new myObject; //will use shared_ptr, but here i want simplicity 

    ptr->update(); 

질문은 적절한 업데이트 기능 (myObject에서 구현 된 함수)이 호출됩니까? 그리고 하나의 "가족"에 같은 이름의 순수 가상 함수 2 개를 갖는 것이 유효한가?동일한 함수 이름을 가진 다른 추상 클래스를 상속하는 추상 클래스

+0

왜 정확히 하시겠습니까? 확실하게 하나의 추상적 인 방법 만이 속임수를 사용합니다. – antonijn

+0

@Antonie Blom 나는 게시/구독 패턴을 가지고 있으며 모든 엔티티는 구독자입니다. 게시 된 메시지 (새로운 메시지가있을 경우)를 저장하고 엔티티 관리자 (enity *를 사용하여)로부터 호출 된 업데이트가있는 객체에서 업데이트 (subscriber * 사용)라는 업데이트가 있기 때문에 2 가지 기능이 있습니다. – user1873947

+0

컴파일러에서 동작을 확인했을 때 어떤 현상이 발생 했습니까? 컴파일러에서이 동작을 확인하는 것이 쉽습니다. –

답변

5

적절한 업데이트 기능 (myObject에서 구현 된 기능)이 호출됩니까?

예, 호출됩니다.

하나의 "가족"에 동일한 이름의 순수한 가상 함수 2 개를 사용하는 것이 유효합니까? 가족으로 초 순수 가상 함수를 도입하지 않는

번째 선언합니다 (즉 entity 클래스 내에) 서명이 동일하므로 update() 단일 가상 함수이다. 또한 두 번째 선언을 반드시 선언 할 필요는 없습니다. entity은 추상 상태로 유지되며 두 번째 선언을 제거하더라도 update() 메서드에 액세스 할 수 있습니다.

+0

이 답변은 불필요 할 때까지 모두 좋았습니다. * 두 곳에서 나타 났지만 vtable 슬롯이 하나만 예약되었습니다. 쪽으로? 당신은 OP를 설명하기 위해 그것이 단지 하나의 기능 만 과장되어 있다는 것을 필요로하지 않습니까? –

+1

@AlokSave 어느 쪽이든 갈 수 있습니다. 나에게 vtable을 사용하면 가상 함수로 어떤 일이 발생하는지 쉽게 시각화 할 수 있지만 모든 사람들이 동일하지는 않을 것이라는 점에 동의한다. – dasblinkenlight

+0

그럼에도 불구하고 기술적으로 거기에서 시작하는 vtable이 없을 수 있습니다 :) 그러므로 내 반대. –

1

가상 함수 또는 가상 메서드는 동일한 서명이있는 함수로 상속 클래스 내에서 동작을 재정의 할 수있는 함수 또는 메서드입니다.

답변은 입니다.

관련 문제