Я в настоящее время возился с шаблоном CRTP с использованием шаблонов C++. В то время как возиться с визуальной студией, я нашел несколько способов/методов, в которых производный класс может вызывать реализацию функции базового класса. Ниже приведен код, который я использую, а также 3 строки с комментариями, показывающие, как вызвать реализацию базового класса функции из производного класса. Есть ли преимущество в использовании одного метода над другим? Есть ли различия? Каков наиболее распространенный метод?CRTP - Как вызвать реализацию базового класса метода из производного класса?
template<typename T>
struct ConsoleApplication
{
ConsoleApplication()
{
auto that = reinterpret_cast<T*>(this);
that->ShowApplicationStartupMsg();
}
void ShowApplicationStartupMsg()
{
}
};
struct PortMonitorConsoleApplication : ConsoleApplication <PortMonitorConsoleApplication>
{
void ShowApplicationStartupMsg()
{
// __super::ShowApplicationStartupMsg();
// this->ShowApplicationStartupMsg();
// ConsoleApplication::ShowApplicationStartupMsg();
}
};
Почему базовые и производные классы должны иметь значение 'ShowApplicationStartupMsg()'? Если производный ничего не делает, кроме вызова базы, вы должны опустить версию в производном классе. – willj
Только один из этих трех является действительным способом вызова скрытого базового метода. – hvd
Конструктор базового класса имеет неопределенное поведение. База находится в процессе инициализации, но ни один из членов производного экземпляра и ни один из его членов еще не инициализирован. Вы вызываете объект, который еще не был полностью инициализирован. Вы также не должны использовать 'reinterpret_cast' здесь, вместо этого используйте' static_cast'. –