2011-10-04 5 views
4

C++에서 - 파생 클래스가 기본 클래스에서 파생되고 파생 클래스가 재정의하는 기본 클래스에 가상 메서드가있는 경우를 예로 들자. 누군가 가상 함수의 파생 된 클래스 버전이 가상 함수의 기본 클래스 버전을 호출해야하는 실제 시나리오를 나에게 말할 수 있습니까? 당신은 MFC의 실제 예를 많이 찾을 수 있습니다파생 클래스 가상 메서드로 기본 클래스 가상 메서드 호출

class Base 
{ 
public: 
    Base() {} 
    virtual ~Base() {} 
    virtual void display() { cout << "Base version" << endl; } 
}; 

class Derived : public Base 
{ 
public: 
    Derived() {} 
    virtual ~Derived() {} 
    void display(); 
}; 

void Derived::display() 
{ 
    Base::display(); // a scenario which would require to call like this? 
    cout << "Derived version" << endl; 
} 
+7

파생 클래스가 기본 클래스의 기능을 확장하는 경우가 있으므로 기본 작업을 복제하는 대신 호출하여 추가 단계를 수행합니다 파생 클래스에서. – Praetorian

답변

11

기본 클래스 동작이 필요하지만이를 다시 구현할 필요가 없거나 다시 구현할 수 없을 때마다 그렇게합니다.

한 가지 일반적인 예는 직렬화 :

void Derived::Serialize(Container& where) 
{ 
    Base::Serialize(where); 
    // now serialize Derived fields 

} 

당신은 직렬화 얼마나 기본 클래스 상관 없어,하지만 당신은 기본 클래스 메서드를 호출 할 수 있도록 당신은 확실히, 그것은 (그렇지 않으면 일부 데이터가 손실) 직렬화 할 .

3

예. 에 있습니다. 예컨대

CSomeDialog::OnInitDialog() 
{ 
    CDialogEx::OnInitDialog(); //The base class function is called. 
    ---- 
    ----- 
} 
3

예, 가끔이 직렬화로 수행됩니다

상위 클래스뿐만 아니라 파생 클래스 모두에 데이터 읽기/쓰기를 원하기 때문에이 작업이 완료
class A{ 
    int x; 
public: 
    A() : x(0) {} 
    virtual void out(Output* o) { 
     o->write(x); 
    } 
    virtual void in(Input* i) { 
     i->read(&x); 
    } 
} 

class B : public A{ 
    int y; 
public: 
    B() : y(0) {} 
    virtual void out(Output* o) { 
     A::out(o); 
     o->write(y); 
    } 
    virtual void in(Input* i) { 
     A::in(i); 
     i->read(&y); 
    } 
} 

.

이것은 파생 클래스가 기본 클래스 기능을 호출하고 더 많은 것을 추가해야하는 경우에 대한 실제 예입니다.

0

GoF 상태 패턴의 구현에서 substate가 exit() 함수를 가지고 있고 superstate도 가지고있을 때. exit()을 먼저 실행 한 다음 superstate를 실행해야합니다.

관련 문제