C ++에서는 가상 기능을 무시하는 경우 기능이 자동으로 가상입니까?

StackOverflow https://stackoverflow.com/questions/1404797

  •  05-07-2019
  •  | 
  •  

문제

나는 그것을 기대할 것이다 foo 수업에서 선언됩니다 D, 가상으로 표시되지는 않지만 다음 코드는 foo 안에 D (동적 유형에 관계없이 d).

D& d = ...;
d.foo();

그러나 다음 프로그램에서는 그렇지 않습니다. 누구든지 이것을 설명 할 수 있습니까? 가상 함수를 재정의하는 경우 메소드가 자동으로 가상입니까?

#include <iostream>

using namespace std;

class C {
public:
        virtual void foo() { cout << "C" << endl; }
};

class D : public C {
public:
        void foo() { cout << "D" << endl; }
};

class E : public D {
public:
        void foo() { cout << "E" << endl; }
};

int main(int argc, char **argv)
{
        E& e = *new E;
        D& d = *static_cast<D*>(&e);
        d.foo();
        return 0;
}

위의 프로그램의 출력은 다음과 같습니다.

E
도움이 되었습니까?

해결책

표준 10.3.2 (class.virtual) 말한다 :

가상 멤버 함수 VF가 클래스 기반에서 선언되고 클래스에서 파생 된 클래스에서 기본에서 직접 또는 간접적으로 파생 된 경우, 기본과 동일한 이름과 동일한 매개 변수 목록을 가진 멤버 함수 VF가 선언 된 다음 :: VF 또한 가상입니다 (그렇게 선언되었는지 여부).

각주 : 가상 함수와 같은 이름이 동일하지만 다른 매개 변수 목록 (조항)이 반드시 가상 일 필요는 없으며 무시할 필요는 없습니다. 재정의 함수 선언에서 가상 지정자를 사용하는 것은 합법적이지만 중복성이 있습니다 (빈 의미가 있음). Access Control (Clause Class.access)은 재정의를 결정할 때 고려되지 않습니다. --- END FOONOTE

다른 팁

빠른 답변은 아니오 일 수 있지만 정답은

C ++는 기능 숨기기에 대해 알지 못하므로 가상 키워드 표시없이 가상 기능을 우선적으로 수행합니다.

e의 객체의 사본을 만들어 d에 넣지 않습니다. 따라서 d.foo ()는 정상적인 다형성 거동을 따르고 파생 클래스 방법을 호출합니다. 기본 클래스에서 가상으로 선언 된 메소드는 파생 클래스에서도 자동으로 가상이됩니다.

출력 ( "e")은 행동 할 것으로 예상되는대로 정확하게 동작합니다.

이유 : 해당 참조의 동적 (예 : 런타임) 유형은 E입니다. D로 정적 업 캐스트를 수행하지만 실제 객체의 실제 유형을 변경하지는 않습니다.

그것이 가상 방법과 동적 파견의 배후에있는 아이디어입니다.이 경우 인스턴스팅중인 유형의 동작을 볼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top