2017-12-12 23 views
0

다음 코드에서 pBase에서 Base::g()에 어떻게 액세스합니까? Derived::g() 완전히 같은 Derived::f()이다, 또한C++에서 재정의 부모 가상 메서드 액세스

Derived::f() 
Derived::g() 
Base::h() 
Derived::f() 
Derived::g() 
Derived::h() 

:

#include <iostream> 
using namespace std; 

class Base 
{ 
    public: 
    virtual void f(){ cout << "Base::f()" << endl; } 
    virtual void g(){ cout << "Base::g()" << endl; } 
    void h(){ cout << "Base::h()" << endl; } 
}; 

class Derived : public Base 
{ 
    public: 
    void f(){ cout << "Derived::f()" << endl; } 
    virtual void g(){ cout << "Derived::g()" << endl; } 
    void h(){ cout << "Derived::h()" << endl; } 
}; 

int main() 
{ 
    Base *pBase = new Derived; 
    pBase->f(); 
    pBase->g(); 
    pBase->h(); 

    Derived *pDerived = new Derived; 
    pDerived->f(); 
    pDerived->g(); 
    pDerived->h(); 
    return 0; 
} 

출력은 (그리고 여전히 아래처럼 일 "pBase->g();"를 얻을)? (예. 자동 virtual로 정의?)

+2

귀하의 코드는 (표시 한대로)'f' 함수를 호출하지 않으므로 요청 된 출력이 코드와 일치하지 않습니다. –

+0

수정 됨. 감사. – nekonaute

답변

6
  1. 사용 pBase->Base::g();Baseg의 전화를 강제로.

  2. 예, Derived::fvirtual입니다. 나는 개인적으로 다시 virtual의 강조 가난한 취향에있을 찾으십시오. C++ 11 이후에는 재정의 된 함수에 override 지정자를 사용할 수 있으며 virtual을 기본 클래스에서 삭제하면 컴파일러에서 진단을 실행합니다.

+0

@Bathsheba 간단합니다! 감사!! – nekonaute