Переопределение реализации метода внедрения без прямого наследования - PullRequest
0 голосов
/ 26 октября 2018

Ребята, знаете ли вы, возможно ли внедрить реализацию метода класса A, который ничего не наследует, в класс C, который наследует от класса B, который предоставляет виртуальный метод, который "переопределяет".

По сути, что-то вроде:

struct Base
  {
    virtual void print()
      {
      std::cout << " Base" << std::endl;
      }
  };

template<class T>
struct Super : public Base,
    protected T
  {
  using T::print; // Do some magic here
  };

struct Derived
  {
  void print()
    {
    std::cout << " Derived" << std::endl;
    }
  };

struct Derived2 : public Base
  {
  void print()
    {
    std::cout << " Derived2" << std::endl;
    }
  };

Небольшой тестовый пример будет:

  Super<Derived> s;
  Base* base = &s;
  std::cout << "Base with Super<Derived>: ";
  base->print();
  std::cout << std::endl;
  std::cout << "Super<Derived>: ";
  s.print();
  std::cout << std::endl;
  std::cout << "Base with Derived: ";
  Derived2 d;
  Base* baseForDerived = &d;
  baseForDerived->print();

, который печатает:

TBase with Super<Derived>:  Base

Super<Derived>:  Derived

TBase with Derived:  Derived2

В идеалесначала следует вывести Derived.

Цель состоит в том, чтобы сделать это без снижения производительности по сравнению с Derived2, поэтому виртуальное наследование или другие виды косвенных указаний не допускаются.

PS: CRTP не допускается в "T"класс, как: template<class C> struct Derived : C {};

1 Ответ

0 голосов
/ 26 октября 2018

Разве это не то, что вы хотите?

struct Base {
    virtual void print() {
        std::cout << "Base" << std::endl;
    }
};

template<class T>
struct Super : Base, T {
    virtual void print() /* final */ override {
        T::print();
    }
};

struct Derived {
    void print() {
        std::cout << "Derived";
    }
};

struct Derived2 : Base {
    virtual void print() override {
        std::cout << "Derived2";
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...