Виртуальная функция в 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();
Другие вопросы по тегам