2010-05-07 3 views
8
class Base 
{ 
public: 
    virtual void foo() const 
    { 
     std::cout << "Base"; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual void foo() const 
    { 
     std::cout << "Derived"; 
    } 
}; 

Derived d; // call Base::foo on this object 

캐스팅 및 함수 포인터를 시도했지만 수행 할 수 없었습니다. 가상 메커니즘을 무효화 할 수 있습니까 (가능한 경우에만 궁금합니다)?파생 된 유형의 객체에 대한 기본 클래스에서 가상 메서드를 호출합니다.

+0

가능한 [파생 클래스를 가리키는 기본 클래스 포인터를 통해 기본 클래스 메서드를 호출하는 방법] (http://stackoverflow.com/questions/1136249/how-to-call-base-class-method-through-base) -class-pointer-pointing-to-derived-cla) – outis

답변

24

명시 적으로 사용 Base에 정의 된 함수를 foo()를 호출하려면 : d.foo()에 관계없이 foo 가상 아닌지 여부의 Derived::foo를 호출 할 것이라고

d.Base::foo(); 
+0

+1 당신도 Daniel - 당신이 대답하는 방식이 처음에는 나에게 보이지 않았다. – ChrisBD

+1

@ChrisBD : 게시 한 후 갑자기이 구조체를 직접 사용하지 못했다는 사실을 알게되었습니다 (파생 클래스의 함수 정의 내에서만). 따라서 나는 그것이 효과가 있다는 것을 확신 할 때까지 잠시 동안 삭제하기로 결정했다. –

6
d.Base::foo(); 

참고.

+0

+1 @Marcelo - 당신은 나를 위해 너무 빠르다. :) – ChrisBD

+1

어 ... 실제로 정규화 된 이름이 * virtual dispath *를 (를) 패배시킨다. 'd.foo()'호출이 가상이 아니라고 가정하는 것 같습니다. 그 언어는 그다지 그런 말을하지 않습니다. 'd.foo()'호출은 언어 관점에서 * 가상 *입니다. 즉, 'd'의 동적 유형에 따라 호출됩니다. 컴파일러가 정적으로 디스패치하면 컴파일러에서 최적화를 수행하는 것입니다 (동적 유형은 컴파일 타임에 알려짐). 언어 관점에서 볼 때 가상 디스패치를 ​​무력화하는 유일한 방법은 완전한 이름을 사용하는 것입니다. – AnT

+0

그것은 두 가지를 모두 이겨냅니다. 하지만'b-> Base :: foo' * 만 가상 디스패치를 ​​무효화합니다. –

관련 문제