BlinCT
15 июня 2020 г. 2:27

Ограничение наследования метода из базового класса

Всем привет.
Возникла необходимость ограничить наследование метода. Есть 3 класса и есть базовый.
В базовом есть метод, его видят все наследники. Но нужно сделать так чтобы 2 наследника его видели а третий не видел его.

  1. // базовый
  2. class clBase
  3. {
  4. public:
  5. explicit clBase(int i);
  6.  
  7. protected:
  8. int getInt() const;
  9.  
  10. protected:
  11. virtual void foo();
  12. };
  13.  
  14. // первый и вторйо наследники используют метод getInt()
  15. #include "clBase.hpp"
  16.  
  17. class cl1 : private clBase
  18. {
  19. public:
  20. explicit cl1();
  21. };
  22. //реализация первого
  23. #include "cl1.hpp"
  24.  
  25. cl1::cl1()
  26. : clBase(1)
  27. {
  28. getInt();
  29. }
  30.  
  31. #include "clBase.hpp"
  32.  
  33. class cl2 : private clBase
  34. {
  35. public:
  36. explicit cl2();
  37. };
  38.  
  39. //реализация второго
  40. #include "cl2.hpp"
  41.  
  42. cl2::cl2()
  43. : clBase(3)
  44. {
  45. getInt();
  46. }
  47.  
  48. // третий наследует первый и второй классы
  49. #include "cl1.hpp"
  50. #include "cl2.hpp"
  51.  
  52. class cl3 : public cl1, public cl2, public clBase
  53. {
  54. public:
  55. explicit cl3();
  56. };
  57.  
  58. //реализация, вот тут возникает конфликт, через кого класс видит метод
  59. //надо сделать так чтобы он его видел сразу из базового, но не через другие два
  60. #include "cl3.hpp"
  61.  
  62. cl3::cl3()
  63. : cl2()
  64. , cl1()
  65. {
  66. getInt();
  67. }

Буду признателен если кто подскажет как это можно сделать.
Спасибо

3

Вам это нравится? Поделитесь в социальных сетях!

4
BlinCT
  • 15 июня 2020 г. 2:53

Может есть какой то вариант через интерфейс или через патерн какой нибудь?

    N
    • 15 июня 2020 г. 3:01
    • (ред.)

    Если я правильно понял проблему то надо сделать так:

    1. class cl1 : virtual public clBase
    2. class cl2 : virtual public clBase

    и в конструкторе cl3 выполнить

    1. clBase::getInt();

    Хотя метод и так будет вызываться из базового класса.
    Да и cl3 реализуется как

    1. class cl3 : public cl1, public cl2
      BlinCT
      • 15 июня 2020 г. 3:52

      Вот как раз виртуальнео наследование тут не вариант.
      После этого он создает проблему с приведением указателья базового класса. И как раз мне и нужно избавится от виртуального наследования.

        Evgenii Legotckoi
        • 15 июня 2020 г. 11:01

        В конструкторе виртуальные методы не стоит вызывать. На момент создания объекта не до конца сформирована привязка методов в таблице вирутальных методов. В итоге или не работает или черти что происходит. Для вызова виртуальных необходимо писать какой-нибудь initialize метод, и вызывать его после создания объекта.

          Комментарии

          Только авторизованные пользователи могут публиковать комментарии.
          Пожалуйста, авторизуйтесь или зарегистрируйтесь