서명 차이로 인해 잘못된 자식 클래스 함수가 호출 됨

errno_44

이벤트를 내보내는 이벤트 이미 터와 이벤트를 처리하는 이벤트 핸들러가 있습니다. 나는 확장 할 수있는 Event다른 같은 행사하기 위해 개체를 AlarmEvent, 그리고 EventHandler수 있도록 개체를 AlarmEventHandler. EventHandler기능이 HandleEvent(Event &event)있습니다. 이로 인해 HandleEvent(AlarmEvent &event)메서드 가있을 수있는 자식 클래스에 문제가 발생 합니다. 분명히 이들은 두 가지 다른 기능이므로 여기에서 재정의가 발생하지 않습니다. 대신 HandleEvent자식 클래스에 의해 재정의되어야합니다.

나는 문제가 각각 EventHandler다른 HandleEvent서명을 가지고 있으므로 EventEmitter항상 기본 이벤트를 처리 한다는 것을 완전히 이해합니다 EventHandler::HandleEvent. Event &event매개 변수로 사용 EventEmitter::Emit하면 어떤 종류의 Event문제를 다루고 있는지 알고 올바른 방법을 선택할 수 있다고 생각했습니다 .

기본 메서드 대신 어떻게 EventEmitter호출 할 수 있습니까?AlarmEventHandler::HandleEventEventHandler::HandleEvent

// Example program
#include <iostream>
#include <string>
#include <vector>

// event types
class Event {};
class AlarmEvent : public Event {};

// event handler
class EventHandler {
    public:
        virtual void HandleEvent(Event event);
};
void EventHandler::HandleEvent(Event event){
    std::cout << "Handle event " << std::endl;   
}

// alarm event handler
class AlarmEventHandler : public EventHandler {
    public:
        void HandleEvent(AlarmEvent event);  
};
void AlarmEventHandler::HandleEvent(AlarmEvent event){
    std::cout << "Handle alarm event " << std::endl;   
}

// event emitter
class Emitter {
    public:  
        std::vector<EventHandler*> handlers;
        void Emit(Event &event);
};
void Emitter::Emit(Event &event){
    for(size_t i = 0; i < this->handlers.size(); i++){
        this->handlers[i]->HandleEvent(event);   
    }
}

int main()
{
    AlarmEventHandler handler;
    AlarmEvent event;
    Emitter emitter;
    emitter.handlers.push_back(&handler);
    // problem:
    // Handle event printed instead of Handle alarm event
    emitter.Emit(event);
}
scohe001

를 사용 dynamic_cast!

따라서 AlarmEventHandler다음과 같이 보일 수 있습니다.

// alarm event handler
class AlarmEventHandler : public EventHandler {
    public:
        void HandleEvent(const Event &event); // Our polymorphic override
        void HandleEvent(AlarmEvent event);  // Our custom Alarm logic
};

void AlarmEventHandler::HandleEvent(const Event &event){
    try {
        HandleEvent(dynamic_cast<const AlarmEvent&>(event));
    } catch(const std::exception& e) {
        std::cerr << "I can't handle things that aren't AlarmEvents!" << std::endl;
    }
}

void AlarmEventHandler::HandleEvent(const AlarmEvent &event){
    std::cout << "Handle alarm event " << std::endl;   
}

하지만 이렇게하려면 Event다형성 클래스가되어야합니다. 따라서 소멸자를 만듭니다 virtual.

class Event { 
    public: virtual ~Event() {} //Need this so Event is a polymorphic class
};

여기에서 실행을 참조하십시오 : https://ideone.com/KMkLfq

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

자식 Reactjs에서 부모 함수를 호출 할 때 잘못된 값이 표시됨

분류에서Dev

잘못된 후크 호출, 함수에서 클래스로 변환

분류에서Dev

UIButton이 잘못된 클래스에서 함수를 호출합니다.

분류에서Dev

사용자 입력으로 인해 잘못된 If-Statement 분기가 출력 됨

분류에서Dev

서명이 잘못된 main () 함수가 호출됩니다.

분류에서Dev

Objective-C-NSTimer : 인식 할 수없는 선택기가 클래스로 전송 됨-다른 클래스에서 메소드 호출

분류에서Dev

Objective-C-NSTimer : 인식 할 수없는 선택기가 클래스로 전송 됨-다른 클래스에서 메소드 호출

분류에서Dev

프로그램에서 잘못된 문자가 인쇄 됨

분류에서Dev

OS X 명령 줄에서 잘못된 ctag가 호출 됨

분류에서Dev

자바 스크립트 최대 호출 스택 크기가 함수 대괄호 제거로 인해 수정 됨

분류에서Dev

.net 원격, 델리게이트가 잘못된 프로세스에서 호출 됨

분류에서Dev

두 번째 생성자가 C ++에서 호출 됨 (잘못된 출력)

분류에서Dev

InvalidOperationException : 제출되는 잘못된 목록 양식으로 인해 오류가 표시됨

분류에서Dev

for 루프의 비동기 호출로 인해 콜백에서 변수가 잘못됨

분류에서Dev

"<사용자 이름>에 대한 자격 증명이 잘못됨"으로 인해 Ldapmain에서 사용자를 인증 할 수 없습니다.-Helm 차트를 통해 설치된 Gitlab Community Edition

분류에서Dev

자바에서 봉인 된 클래스로 매개 변수를 사용하여 코 틀린 함수를 호출

분류에서Dev

로그에 쓰기 위해 C 함수를 호출하는 동안 잘못된 파일 설명자 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

C ++ 클래스 출력이 잘못됨

분류에서Dev

클래스에서 잘못된 버전의 재정의 된 [] 연산자가 호출되었습니다.

분류에서Dev

addTarget 호출시 UIView 클래스의 "인식되지 않은 선택기가 인스턴스로 전송 됨"

분류에서Dev

클래스의 함수를 호출하지만 인수로 전달됨

분류에서Dev

클래스 생성자에서 명명 된 람다를 호출하는 것과 실제 개인 함수를 호출하는 것의 장점

분류에서Dev

사용자 정의 벡터 클래스에서 잘못된 생성자가 호출되었습니다.

분류에서Dev

PowerShell Get-ADUser 암호 만료로 인해 잘못된 날짜가 제공됨

분류에서Dev

중국어 로케일에서 잘못된 문자 오류로 인해 AES 암호 해독이 실패 함

분류에서Dev

Fortran : 부모 클래스에서 자식을 할당 할 때 자식 대신 부모의 일반 프로 시저가 호출 됨

분류에서Dev

Windows 10-Alt 코드로 인해 잘못된 문자가 생성됨

분류에서Dev

자바 스크립트 애플리케이션 : 잘못된 디자인으로 수백 건의 Ajax 호출

분류에서Dev

자바 스크립트 애플리케이션 : 잘못된 디자인으로 수백 건의 Ajax 호출

Related 관련 기사

  1. 1

    자식 Reactjs에서 부모 함수를 호출 할 때 잘못된 값이 표시됨

  2. 2

    잘못된 후크 호출, 함수에서 클래스로 변환

  3. 3

    UIButton이 잘못된 클래스에서 함수를 호출합니다.

  4. 4

    사용자 입력으로 인해 잘못된 If-Statement 분기가 출력 됨

  5. 5

    서명이 잘못된 main () 함수가 호출됩니다.

  6. 6

    Objective-C-NSTimer : 인식 할 수없는 선택기가 클래스로 전송 됨-다른 클래스에서 메소드 호출

  7. 7

    Objective-C-NSTimer : 인식 할 수없는 선택기가 클래스로 전송 됨-다른 클래스에서 메소드 호출

  8. 8

    프로그램에서 잘못된 문자가 인쇄 됨

  9. 9

    OS X 명령 줄에서 잘못된 ctag가 호출 됨

  10. 10

    자바 스크립트 최대 호출 스택 크기가 함수 대괄호 제거로 인해 수정 됨

  11. 11

    .net 원격, 델리게이트가 잘못된 프로세스에서 호출 됨

  12. 12

    두 번째 생성자가 C ++에서 호출 됨 (잘못된 출력)

  13. 13

    InvalidOperationException : 제출되는 잘못된 목록 양식으로 인해 오류가 표시됨

  14. 14

    for 루프의 비동기 호출로 인해 콜백에서 변수가 잘못됨

  15. 15

    "<사용자 이름>에 대한 자격 증명이 잘못됨"으로 인해 Ldapmain에서 사용자를 인증 할 수 없습니다.-Helm 차트를 통해 설치된 Gitlab Community Edition

  16. 16

    자바에서 봉인 된 클래스로 매개 변수를 사용하여 코 틀린 함수를 호출

  17. 17

    로그에 쓰기 위해 C 함수를 호출하는 동안 잘못된 파일 설명자 오류가 발생하는 이유는 무엇입니까?

  18. 18

    C ++ 클래스 출력이 잘못됨

  19. 19

    클래스에서 잘못된 버전의 재정의 된 [] 연산자가 호출되었습니다.

  20. 20

    addTarget 호출시 UIView 클래스의 "인식되지 않은 선택기가 인스턴스로 전송 됨"

  21. 21

    클래스의 함수를 호출하지만 인수로 전달됨

  22. 22

    클래스 생성자에서 명명 된 람다를 호출하는 것과 실제 개인 함수를 호출하는 것의 장점

  23. 23

    사용자 정의 벡터 클래스에서 잘못된 생성자가 호출되었습니다.

  24. 24

    PowerShell Get-ADUser 암호 만료로 인해 잘못된 날짜가 제공됨

  25. 25

    중국어 로케일에서 잘못된 문자 오류로 인해 AES 암호 해독이 실패 함

  26. 26

    Fortran : 부모 클래스에서 자식을 할당 할 때 자식 대신 부모의 일반 프로 시저가 호출 됨

  27. 27

    Windows 10-Alt 코드로 인해 잘못된 문자가 생성됨

  28. 28

    자바 스크립트 애플리케이션 : 잘못된 디자인으로 수백 건의 Ajax 호출

  29. 29

    자바 스크립트 애플리케이션 : 잘못된 디자인으로 수백 건의 Ajax 호출

뜨겁다태그

보관