Предположим, что мы имеем следующее:
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();"?
Как обычно. Переопределить базовую виртуальную функцию в производном классе.
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;
}
Вы действительно не много говорите о своей проблеме, поэтому трудно отличить то, что вам нужно от потенциальной проблемы XY.
Одна из потенциальных проблем с вашей архитектурой заключается в том, что у вас есть Parent
и Child
классы, которые разделяют статическую bar
переменных, но вы, похоже, инициализируете их по-разному для классов " Parent
и Child
. Тем не менее, существует только один bar
который делится как с родительскими, так и с Child
объектами, независимо от того, кто написал ему последний.
Итак, что вы ожидаете, когда одновременно используются объекты " Parent
и Child
? Ответ, который вы ищете, зависит от вашего ответа на этот вопрос. В частности, если ваш ответ: "Он не предназначен для одновременного использования объектов" Parent
и Child
", то оба класса не должны разделять статическую переменную.
Я не уверен, что вы здесь точно хотите. Однако вы можете переопределить статическую функцию следующим образом:
class Child: public Parent
{
public:
static bool foo() {return false;};
};
Child::foo()
возвращалfalse
?