Переназначение метода в наследуемом классе
- Войдите на сайт для отправки комментариев
Добрый день. Есть такая замечательная библиотека как LiquidCrystal_I2C
Там все хорошо работает с экраном а все общение с апаратной частью вынесено в метод expanderWrite
Вот мне нужно сделать свой класс который бы аботал один-в-один всеми методами этой библиотеки но метод expanderWrite должен использоваться моим.
Так вот я конечно могу скопировать себе эту библиотеку, подправить ей имена классов и написать свой expanderWrite но это не спортивно чтоли. Теоретически я могу создать свой класс, который будет наследоваться от LiquidCrystal_I2C а уже в нем я теоретически могу заменить этот метод своим но я не совсем понимаю как это сделать? просто написав в своем классе такой же метод с таким же названием но вызывая метод из основного класса - он берет свой же метод а не мой.
class liquid { public: liquid(); void go(); private: void worker(); }; liquid::liquid() { Serial.println("Liquid created"); } void liquid::worker() { Serial.println("Liquid worker"); } void liquid::go() { worker(); } class liq : public liquid { public: liq(); private: void worker(); }; liq::liq() { Serial.println("Liq created"); } void liq::worker() { Serial.println("Liq worker"); } void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial.println("Started.."); liquid lc; lc.go(); liq lq; lq.go(); }
вот этот код выдает
Невозможно.
У тебя в дочернем классе не переопределен метод go(), а значит вызывается метод родителя liquid::go(), который в свою очередь вызывает свой метод liquid::worker().
1. Переопределить метод go() в дочернем:
2. Переопределить сразу метод worker() и вызывать его напрямую (если это целесообразно):
В обоих случаях у меня вывод такой:
3. Может быть как-то так попробовать решить задачу?
Если метод не объявлен виртуальным, то все другие методы родительского класса будут вызывать свой метод, а не метод дочернего класса. Потому, либо объявлять виртуальным, либо заменять все методы, которые его вызывают.
Это вообще возможно не влезая в родную библиотеку?
совсем не влезая в родную библиотеку - НЕТ