Я видел Is it possible to replace a method at runtime in C/C++?, но я кое-что новичок в C++, и поэтому пока не вижу, как (и если) это применимо к моему делу, поэтому я хотел бы попробовать спросить с моим примером.Замена метода базового класса C++?
В приведенном ниже примере, предположим, что классы MyBase
, A1
и A2
, из какой-нибудь библиотеки, и я их использую в моей main
:
// g++ -std=c++11 -o test.exe test.cpp
#include <iostream>
using namespace std;
class MyBase {
public:
MyBase() { }
~MyBase() { }
int getBaseVal(int inval) {
return inval + 5;
}
};
class A1 : public MyBase {
public:
A1() : MyBase() { }
~A1() { }
int getVal(int inval) {
return getBaseVal(inval) + 10;
}
};
class A2 : public A1 {
public:
A2() : A1() { }
~A2() { }
int getVal(int inval) {
return getBaseVal(inval) + 20;
}
};
int main() {
A1 _a1 = A1(); A2 _a2 = A2();
cout << "A1 for 10: " << _a1.getVal(10) << endl;
cout << "A2 for 10: " << _a2.getVal(10) << endl;
return 0;
}
Теперь, скажем, я хотел бы оставить это библиотека была нетронутой, но я обнаружил ошибку в MyBase::getBaseVal
, так как возвращаемое правое значение должно быть inval + 6;
вместо заданного inval + 5;
. Итак, ничего сложного, но нужен вход для входных аргументов метода.
Так что у меня есть возможность, чтобы определить новую функцию, скажем:
int getNewBaseVal(int inval) {
return inval + 6;
}
.. а потом как-то "заменить" старый MyBase::getBaseVal
:
- На уровне класса (т.е. is,
MyBase
будет «исправлен»), так что все последующие экземплярыA1
иA2
в конечном итоге будут использоватьgetNewBaseVal
, когда вызывается ихgetVal
s; - На уровне объекта, так что только конкретный экземпляр объекта, скажем,
A1
как объекта (например,_a1
), в конечном итоге будет использоватьgetNewBaseVal
, когда вызывается егоgetVal
;
... путем написания кода в начале функции main
?
Итак, вы полностью прочитали предыдущие вопросы и ответы о том, можно ли заменить метод ......... тогда вы снова задали тот же вопрос? –
@LightnessRacesinOrbit - ну да; как один, я не уверен, применим ли здесь квалификатор «runtime» (я хотел бы сделать «патч» один раз при запуске, а не изменять его динамически, возможно, для этого есть непринужденные критерии?); во-вторых, если полиморфизм является ответом, у меня нет идеи, как я буду распространять только «MyBase», не имея необходимости также расширять «A1», «A2» и целую цепочку наследования, я хотел бы избежать, и главная причина моего вопроса. – sdaau
Ну, длинный и короткий, что вы не можете. Возьмите автора библиотеки, чтобы исправить ошибку, и создайте свою собственную разветвленную и фиксированную версию. –