Виртуальная функция в C++
В приведенном ниже коде C++ с использованием виртуальных функций
#include<iostream>
using namespace std;
class Base{
public:
virtual void fun(){
cout << "Base::fun()called \n";
}
};
class Child : public Base {
public:
void fun() {
cout << "Child::fun() called\n";
}
void door(){
cout << "Child::door() called \n";
}
};
int main(){
Base *base_ptr = new Child();
base_ptr->fun();
return 0;
}
Как я могу вызвать функцию двери, используя base_ptr? Этот вопрос был задан в интервью. Мне было интересно, возможно ли это
Спасибо за ваши ответы
2 ответа
(При условии, что Base
а также Child
не может быть изменено.)
Ты можешь использовать static_cast
преобразовать base_ptr
в Child*
,
static_cast<Child*>(base_ptr)->door()
Это безопасно, если вы уверены, что base_ptr
на самом деле указывает на Child
пример.
Если вы не знаете, какой производный тип экземпляра base_ptr
указывает на, рассмотреть вопрос об использовании dynamic_cast
:
if(auto child = dynamic_cast<Child*>(base_ptr))
{
child->door();
}
Если компилятору не удастся агрессивно его оптимизировать, dynamic_cast
имеет дополнительные накладные расходы по сравнению с static_cast
,
Так как Base
не имеет door()
метод, вы, очевидно, не можете просто вызвать base_ptr->door()
,
Однако, если вы знаете, base_ptr
это Child
, вы можете разыграть его, а затем позвонить door()
Child* child_ptr = static_cast<Child*>(base_ptr);
child_ptr->door();