Наследование с перегруженными функциями, которые полагаются на чистые виртуальные функции - PullRequest
0 голосов
/ 02 марта 2019

У меня есть базовый класс Write, в котором есть чисто виртуальная функция write (std::string text), для реализации которой требуются все производные классы.В базовом классе есть перегруженная функция write, которая принимает int и вызывает чисто виртуальный write().

. В производном классе мы реализуем write (std::string text), как требуется.

В основном я могу позвонить console.write("dog\n");, но я не могу вызвать его с перегруженной версией, которая принимает int, не пройдя через имя базового класса Write.В любом случае можно ли определить это наследование так, чтобы обе функции write, одна из которых принимала std::string, а другая - int, не передавая подробности наследования, просматривая имя класса Write,как показано в последней строке программы?

Я не хочу, чтобы пользователь мог вызывать перегруженное write(int)' through the Write` имя класса, если это возможно.

#include <iostream>

class Write
{
protected:
    virtual void write (const std::string &text) = 0;

public:
    void write (const int &number)
    {
        write (std::to_string (number));
    }
};

class Console_Write : public Write
{
public:
    void write (const std::string &text) override
    {
        std::cout << text;
    }
};

int main()
{
    Console_Write console;
    console.write("dog\n");
    console.Write::write (1); // Is it possible to be able to change the inheritance so we can just call: console.write (1);
}

1 Ответ

0 голосов
/ 02 марта 2019

Обычный шаблон для этого будет выглядеть так:

class Write {
 public:
  virtual ~Write() = default;
  void write(const std::string& str) {
    write_internal(str);
  }
  void write(int n) {
    write(std::to_string(n));
  }
 private:
  virtual void write_internal(const std::string& str) = 0;
}

class ConsoleWrite : public Write {
 public:
  ~ConsoleWrite() = default;
 private:
  void write_internal(const std::string& str) {
    std::cout << str;
  }
}

Шаблон даже имеет имя "Non-Virtual Interface" - https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface содержит больше информации ошаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...