Закрытие методов класса в наследниках

78
09 марта 2022, 10:50

Есть несколько классов DriverProperty_p — прототип свойств драйвера, DriverProperty<T> — свойство доступное для чтения-записи. DriverPropertyReadOnly< T > и DriverPropertyWriteOnly< T > — свойства доступные только для чтения или записи. В качестве буфера данных использую QByteArray. В прототипе реализованы все необходимые функции отправки и получения данных в/из устройства. Есть следующий код (привожу только header):

class DriverProperty_p
{
public:
    DriverProperty_p(AbstractDriver * parent, QString name, quint8 cmdGetter, quint8 cmdSetter = 0xFF);
    QByteArray getValue();
    void setValue(QByteArray value);
    QString getName() const;
    void setName(const QString &name);
    quint8 getCmdGetter() const;
    void setCmdGetter(const quint8 &cmdGetter);
    quint8 getCmdSetter() const;
    void setCmdSetter(const quint8 &cmdSetter);
private:
    AbstractDriver *mDriver;
    QString mName;
    QByteArray mValue;
    quint8 mCmdGetter;
    quint8 mCmdSetter;
};
template <typename T>
class DriverProperty: public DriverProperty_p
{
    using DriverProperty_p::setValue;
    using DriverProperty_p::getValue;
public:
    DriverProperty(AbstractDriver * parent, QString name, quint8 cmdGetter, quint8 cmdSetter = 0xFF)
        : DriverProperty_p(parent, name, cmdGetter, cmdSetter)
    {}
    static T convertFromByteArray(const QByteArray &ba);
    static QByteArray convertToByteArray(const T & data);
    T getValue()
    {
        return convertFromByteArray(DriverProperty_p::getValue();
    }
    void setValue(T value)
    {
        DriverProperty_p::setValue(convertToByteArray(value));
    }
};
template <typename T>
class DriverPropertyReadOnly: public DriverProperty<T>
{
    using DriverProperty<T>::setValue;
public:
    DriverPropertyReadOnly(AbstractDriver * parent, QString name, quint8 cmdGetter)
        : DriverProperty<T>(parent, name, cmdGetter)
    {}
};
template <typename T>
class DriverPropertyWriteOnly: public DriverProperty<T>
{
    using DriverProperty<T>::getValue;
public:
    DriverPropertyWriteOnly(AbstractDriver * parent, QString name, quint8 cmdGetter)
        : DriverProperty<T>(parent, name, cmdGetter)
    {}
};

При попытке компиляции кода выдает ошибку о том, что недоступен DriverProperty_p::setValue.

Вообще цель подобного кода заключалась в том, чтобы реализовать все функции в классе общего назначения (DriverProperty< T >) (и он работает как надо), а затем скрыть для использования соответствующие методы у потомков. Ну и основной мой вопрос: как правильно скрывать методы в потомках класса.

Answer 1

Возможно Вы имеете ввиду это?

#include <iostream>
#define PURE_VIRTUAL =0
using std::cout;
using std::endl;
using std::cin;
class AbstractDriver
{
public:
    virtual void A() PURE_VIRTUAL;
    virtual void B() PURE_VIRTUAL;
};
class Driver_1 : public AbstractDriver
{
public:
    virtual void A() override { cout << "A" << endl; }
    virtual void B() override { cout << "B" << endl; }
};
class Driver_1_1 : protected Driver_1
{
public:
    void A() override { Driver_1::A(); };
};
int main()
{
    Driver_1 a;
    Driver_1_1 b;
    a.A(); a.B();
    b.A(); b.B();
    cin.get();
    return 0;
}

Код не скомпилируется потому что b.B() недоступен

READ ALSO
Таблица, в которой значения уникальны только по своему id

Таблица, в которой значения уникальны только по своему id

У меня есть простая таблица, где каждое поле word привязано к значению id (auto increment) из другой таблицы

154
Android cameraX

Android cameraX

Можно ли использовать cameraX в background services? Нашёл пример с camera2 api, но не нашёл ничего подобного для cameraX

168
Не понимаю что будет выведено в консоль?

Не понимаю что будет выведено в консоль?

Что будет выведено в консоль? Дали задание

108
Упаковать jre в exe launch4j

Упаковать jre в exe launch4j

Скажите пожалуйста, возможно ли сделать так: Положить jre в отдельную папку, в launch4j указать путь к этой папке и чтобы при запуске exe-файла jre бралась...

174