Ребята, знаете ли вы, возможно ли внедрить реализацию метода класса 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 {};