BlinCTJune 15, 2020, 2:27 a.m.
Ограничение наследования метода из базового класса
Всем привет.
Возникла необходимость ограничить наследование метода. Есть 3 класса и есть базовый.
В базовом есть метод, его видят все наследники. Но нужно сделать так чтобы 2 наследника его видели а третий не видел его.
// базовый class clBase { public: explicit clBase(int i); protected: int getInt() const; protected: virtual void foo(); }; // первый и вторйо наследники используют метод getInt() #include "clBase.hpp" class cl1 : private clBase { public: explicit cl1(); }; //реализация первого #include "cl1.hpp" cl1::cl1() : clBase(1) { getInt(); } #include "clBase.hpp" class cl2 : private clBase { public: explicit cl2(); }; //реализация второго #include "cl2.hpp" cl2::cl2() : clBase(3) { getInt(); } // третий наследует первый и второй классы #include "cl1.hpp" #include "cl2.hpp" class cl3 : public cl1, public cl2, public clBase { public: explicit cl3(); }; //реализация, вот тут возникает конфликт, через кого класс видит метод //надо сделать так чтобы он его видел сразу из базового, но не через другие два #include "cl3.hpp" cl3::cl3() : cl2() , cl1() { getInt(); }
Буду признателен если кто подскажет как это можно сделать.
Спасибо
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
Г
- Геній
- Sept. 13, 2024, 10:46 p.m.
C++ - Test 001. The first program and data types
- Result:66points,
- Rating points-1
t
- torgaev_2024
- Sept. 8, 2024, 4:20 p.m.
C++ - Test 001. The first program and data types
- Result:33points,
- Rating points-10
Last comments
How to Copy Files in Linux Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
ВР
How to Copy Files in Linux Screenshot_20240802-065123.png
Влад РусоковAug. 2, 2024, 11:47 a.m.
QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий КононенкоFeb. 5, 2024, 12:50 p.m.
Now discuss on the forum
Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCTJune 25, 2024, 11 a.m.
BlinCTMay 5, 2024, 3:46 p.m.
Evgenii LegotckoiMay 3, 2024, 12:07 a.m.
Может есть какой то вариант через интерфейс или через патерн какой нибудь?
Если я правильно понял проблему то надо сделать так:
и в конструкторе cl3 выполнить
Хотя метод и так будет вызываться из базового класса.
Да и cl3 реализуется как
Вот как раз виртуальнео наследование тут не вариант.
После этого он создает проблему с приведением указателья базового класса. И как раз мне и нужно избавится от виртуального наследования.
В конструкторе виртуальные методы не стоит вызывать. На момент создания объекта не до конца сформирована привязка методов в таблице вирутальных методов. В итоге или не работает или черти что происходит. Для вызова виртуальных необходимо писать какой-нибудь initialize метод, и вызывать его после создания объекта.