вызывать дочернюю статическую функцию из родительского?

0

Предположим, что мы имеем следующее:

class Parent {
public:
     virtual void run() {
         for (int i = 0 ; i < bar.size() ; ++it)
              cout << i << "\n" ;
     };
protected:
     static vector<int> foo() {return vector r({1,2,3,4,5});};
     static vector<int> bar;
}
vector<int> Parent::bar = Parent::foo();

Теперь, если я создаю дочерний класс, чья функция запуска будет вызвана извне, как я могу переопределить функцию foo, чтобы возвращать что-то еще при использовании функции запуска родителя?

Изменение: Извините, позвольте мне добавить дополнительную информацию. Предположим, что виртуальная функция run() - это много кода, все из которых по существу одинаковы. Единственное отличие в родительском и дочернем классах - это то, какие значения я хочу указать в векторной строке, поэтому было бы немного расточительно переопределять виртуальную функцию в дочернем классе. Однако, если вы переопределите Child :: bar и вызовите Child :: run(), используйте Parent :: bar, поскольку он определен в родительском классе. Есть ли способ иметь строку "vector Parent :: bar = Parent :: foo();" знаете в классе "Дети" использовать "Child :: foo();"?

  • 0
    Я не могу понять, что вы спрашиваете. Вы хотите, чтобы Child::foo() возвращал false ?
  • 0
    отредактировал вопрос с дополнительной информацией, надеюсь, это поможет
Показать ещё 2 комментария
Теги:
inheritance

3 ответа

1

Как обычно. Переопределить базовую виртуальную функцию в производном классе.

class Parent {
public:
     virtual bool run() {return bar;};
     static bool foo() {return true;};
     static bool bar;
};

class Child: public Parent
{
public:
   static bool foo() { return false;};
};

Затем вы можете использовать базовую версию, применяя разрешение Base:: scope:

int main() {

    bool bc = Child::foo();
    bool bp = Parent::foo();

    std::cout << bc << bp;
    return 0;
}

http://ideone.com/TdaNQ5

  • 0
    Привет, спасибо за ответ. Я отредактировал проблему с помощью дополнительной информации - дело в том, что я не хочу переписывать базовую виртуальную функцию, так как в ней много кода, но вызов функции run приведет к использованию базового foo.
  • 0
    что вы подразумеваете под "вызовом функции run, в результате которой будет использоваться базовый foo"?
Показать ещё 1 комментарий
0

Вы действительно не много говорите о своей проблеме, поэтому трудно отличить то, что вам нужно от потенциальной проблемы XY.

Одна из потенциальных проблем с вашей архитектурой заключается в том, что у вас есть Parent и Child классы, которые разделяют статическую bar переменных, но вы, похоже, инициализируете их по-разному для классов " Parent и Child. Тем не менее, существует только один bar который делится как с родительскими, так и с Child объектами, независимо от того, кто написал ему последний.

Итак, что вы ожидаете, когда одновременно используются объекты " Parent и Child? Ответ, который вы ищете, зависит от вашего ответа на этот вопрос. В частности, если ваш ответ: "Он не предназначен для одновременного использования объектов" Parent и Child ", то оба класса не должны разделять статическую переменную.

0

Я не уверен, что вы здесь точно хотите. Однако вы можете переопределить статическую функцию следующим образом:

class Child: public Parent
{
public:
   static bool foo() {return false;};
};
  • 0
    Я добавил больше информации в вопрос, надеюсь, это поможет

Ещё вопросы

Сообщество Overcoder
Наверх
Меню