2012-05-15 3 views
1

기본 클래스의 다른 메서드에서 사용하는 기본 클래스의 메서드를 재정의하려고합니다. 그러나 파생 클래스가 기본 클래스의 using 메서드를 호출하면 파생 된 used 메서드가 실행되지 않고 대신 기본 클래스의 used 메서드가 호출됩니다.C++ 기본 클래스가 자식 클래스의 재정의 된 메서드를 사용하도록 설정합니다.

#include <iostream> 
using namespace std; 
class Base { 
public: 
    Base() {} 
    virtual ~Base() {} 
    void printLeft() { cout << this->getLeft(); } 
    int getLeft() { return 0; } 
}; 

class Derived: public Base { 
public: 
    Derived() {} 
    virtual ~Derived() {} 
    int getLeft() { return 1; } 
}; 
int main(int argc, char *argv[]) { 
    Derived d = Derived(); 
    d.printLeft(); 
} 

파생 객체의 방법보다는 하였다 BasegetLeft() 방식을 나타내는 main()0 인쇄를 실행 : 다음의 예이다.

Derived 인스턴스에서 호출 할 때 Derived::getLeft()이되도록이 코드를 어떻게 변경합니까?

class Base { 
public: 
    Base() {} 
    virtual ~Base() {} 
    void printLeft() { cout << this->getLeft(); } 
    virtual int getLeft() { return 0; } 
}; 

C++에서 기본적으로 멤버 함수는 가상 없습니다 :

+0

죄송합니다. 시간이 없습니다. 이 프로젝트는 내일 마감 예정입니다. 그러나 도움을 주신 제안에 감사드립니다. – weberc2

+0

downvoter (들)에 대한 질문에 특히 잘못된 것이 있습니까? 내가 분명히해야할까요? 나는 연구를 시도했지만 설명하려고하는 현상에 대한 용어를 알지 못했기 때문에 어떤 적절한 결과도 찾을 수 없었습니다. – weberc2

+0

나는이 질문을 downvoted,하지만 당신이 C + +를 배우기 위해 책을 읽으 려하지 않는다고 나에게 이야기하기 전까지는 그렇게하지 않았다. –

답변

6

당신은 getLeft 가상 확인해야합니다. 즉, 하위 클래스에서 재정의 할 수 없습니다.

+1

고마워요.당신은 신사이고 학자입니다. – weberc2

+2

글쎄, 당신은 그것들을 오버라이드 할 수있다. 그것은 오버라이드가 기본 클래스 포인터 나 참조를 통해 호출 될 때 어떤 효과도 가지지 않는다는 것이다. – JohnMcG

+0

반갑습니다. – Nick

1

가상 함수가 아닌 경우 개체의 정적 형식을 사용하여 호출 할 클래스의 메서드를 결정합니다.

getLeft()Base::printLeft() (으)로 보내고 있습니다. this 유형은 Base*이므로 호출 된 함수는 Base::getLeft()이됩니다.

이 방법은 virtual 키워드를 사용하는 것입니다. 이 경우, 가상 함수 테이블은 당신은 BaseDerived 모두 printLeft의 선언에 virtual 앞에 추가하여이 동작을 트리거 할 수 있습니다이 경우 Derived.

에 전화를 getLeft()의 버전을 확인하는 데 사용됩니다.

관련 문제