BlinCT
Маусым 15, 2020, 2:27 Т.Ж.

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

Всем привет.
Возникла необходимость ограничить наследование метода. Есть 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();
}

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

3

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

4
BlinCT
  • Маусым 15, 2020, 2:53 Т.Ж.

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

    N
    • Маусым 15, 2020, 3:01 Т.Ж.
    • (өңделген)

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

    class cl1 : virtual public clBase
    class cl2 : virtual public clBase
    

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

    clBase::getInt();
    

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

    class cl3 : public cl1, public cl2
    
      BlinCT
      • Маусым 15, 2020, 3:52 Т.Ж.

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

        Evgenii Legotckoi
        • Маусым 15, 2020, 11:01 Т.Ж.

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

          Пікірлер

          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
          Кіріңіз немесе Тіркеліңіз