Как вызвать оригинальную функцию после того, как она была переопределена в C ++? - PullRequest
8 голосов
/ 05 июля 2011

Я сериализую большинство моих классов с двумя функциями: 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. Таким образом, мне не нужно повторять код сериализации для каждого подкласса (и, возможно, забудьте об этом).

Ответы [ 3 ]

18 голосов
/ 05 июля 2011

Вы можете вызывать функции базового класса, добавив к вызову функции идентификатор базового класса, после которого следует оператор области действия (::).

Например:

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().
}

РЕДАКТИРОВАТЬ: Примечание удаляется по запросу.

9 голосов
/ 05 июля 2011
void Sub::read(QDataStream &stream)
{
    Base::read(stream);
    // do Sub stuff here
}
6 голосов
/ 05 июля 2011

Прежде всего - ваши функции-члены не имеют возвращаемых типов - недопустимо в C ++, ваш компилятор может жаловаться на поведение «default int» и пропустить его, но вы должны дать им возвращаемые типы (я буду использовать void в качестве заполнителя).

Можно разрешить область действия и использовать версию родительского класса, когда вы находитесь в подклассе:

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

    // do more stuff
}
...