Используя CRTP, ваш пример
class Parent {
void callSubclassFunction() {
//How can i call method from subchild class here?
}
}
class Child : Parent {
}
class SubChild : Child {
void functionToBeCalledFromParent();
}
превратится в
#include <iostream>
template <typename TSubclass>
class Parent {
public:
void callSubclassFunction() {
static_cast<TSubclass*>(this)->functionToBeCalledFromParent();
}
};
template <typename TSubclass>
class Child : public Parent<TSubclass> {
};
class SubChild : public Child<SubChild> {
public:
void functionToBeCalledFromParent() {
std::cout << "SubChild!" << std::endl;
}
};
int main()
{
SubChild child;
child.callSubclassFunction();
}
Runnable at Coliru
Passing SubChild
в качестве параметра шаблона для Child<>
работ, так как имяТипа действует как только он заявил, который находится непосредственно перед делителем списка наследования :
.
Использование static_cast
в "downcast" в Parent
совершенно безвредно здесь. Если подкласс не определяет функцию, вызванную в Parent
, компиляция просто завершится неудачей.
Этот метод называется статического или во время компиляции полиморфизма, и это то, что ATL и WTL построены на. Опсозитом и, возможно, более обычным методом будет динамический или полигонизм, и это то, что вы получаете с помощью виртуальных функций.
Существует простой способ: использовать виртуальную функцию в 'Parent', переопределенную в' SubChild'. – Deduplicator
Существует менее простой способ: используйте CRTP – Yakk