原始函数在C++被覆盖后如何调用?

How to call original function after it's been overridden in C++?

本文关键字:何调用 调用 函数 C++ 覆盖 原始      更新时间:2023-10-16

我用两个函数read((和write((序列化了我的大多数类。我想做的是从子类中调用基类的read/write((函数,这样我就不必多次重复序列化代码。

例如:

class Base
{
public:
   base();
   virtual read(QDataStream&);
   virtual write(QDataStream&);
private:
   int a, b, c, d;
}
class Sub : public Base
{
public:
    Sub();
    read(QDataStream&);
    write(QDataStream&);
private:
    int e, f, g, h;
}

因此,在本例中,我希望读/写a、b、c、d的代码来自Base。然后,Sub会调用Base::read(QDataStream&(,然后添加Sub唯一的任何属性。这样,我就不必为每个子类重复序列化代码(可能会忘记这样做(。

您可以通过在函数调用前加上基类标识符和范围运算符(::(来调用基类函数。

像这样:

class Base
{
public:
     virtual void Function();
}
class Foo : public Base
{
public:
     void Function();
     void DoSomething();
}
void Foo::DoSomething()
{
     Base::Function();   // Will call the base class' version of Function().
     Function();         // Will call Foo's version of Function().
}

编辑:应要求删除注释。

void Sub::read(QDataStream &stream)
{
    Base::read(stream);
    // do Sub stuff here
}

首先,您的成员函数没有返回类型-在C++中无效,编译器可能会抱怨"default int"行为并让它通过,但您应该给它们返回类型(我将使用void作为占位符(。

当您在子类中时,您可以范围解析并使用父类版本:

void Sub::read(QDataStream& qds) {
    Base::read(qds);
    // do more stuff
}