关于c ++:通过派生类虚方法调用基类虚方法


Calling base class virtual method by derived class virtual method

在C++中,使用派生类从基类派生的情况,并且在基类中存在一个派生类重写的虚拟方法。有人能告诉我一个真实的场景,虚拟函数的派生类版本可能需要调用虚拟函数的基类版本吗?

例子,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}


每当您还需要基类行为但不想(或不能)重新实现它时,您都会这样做。

一个常见的例子是序列化:

1
2
3
4
5
6
void Derived::Serialize( Container& where )
{
    Base::Serialize( where );
    // now serialize Derived fields

}

您不关心基类是如何序列化的,但您肯定希望它序列化(否则会丢失一些数据),所以您调用了基类方法。


是的,有时这是在序列化中完成的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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);
   }
}

这样做是因为您希望同时为父类和派生类读/写数据。

这是一个关于派生类何时还必须调用基类功能以及向其添加更多内容的实际示例。


你可以在MFC中找到很多真实的例子。为了。例如

1
2
3
4
5
6
CSomeDialog::OnInitDialog()
{
  CDialogEx::OnInitDialog(); //The base class function is called.
  ----
  -----
}

在gof状态模式的一个实现中,当一个子状态有一个exit()函数,而超级状态也有。您需要先执行子状态exit(),然后执行超级状态的