如何在C++中重写后调用原始函数?

jec*_*kal 8 c++ qt overriding

我用两个函数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;
}
Run Code Online (Sandbox Code Playgroud)

所以在这个例子中,我希望代码读/写a,b,c,d来自Base.然后,Sub将调用Base :: read(QDataStream&),然后添加Sub独有的任何属性.这样我就不必为每个子类重复序列化代码(并且可能忘记这样做).

Ryc*_*cul 18

您可以通过在函数调用前加上基类标识符,然后是作用域运算符(::)来调用基类函数.

像这样:

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().
}
Run Code Online (Sandbox Code Playgroud)

编辑:注意请求删除.

  • 请删除整个*添加的注释*,它完全偏离主题,更糟糕的是:不正确.初始化列表和限定的成员函数调用完全不相关.它们甚至没有相同的语法,唯一的共同点是基类型的名称出现在代码中的某个位置. (5认同)

Use*_*ess 9

void Sub::read(QDataStream &stream)
{
    Base::read(stream);
    // do Sub stuff here
}
Run Code Online (Sandbox Code Playgroud)


wkl*_*wkl 6

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

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

void Sub::read(QDataStream& qds) {
    Base::read(qds);

    // do more stuff
}
Run Code Online (Sandbox Code Playgroud)