#c #inheritance #casting #runtime #dynamic-cast
#c #наследование #Кастинг #время выполнения #динамическое приведение
Вопрос:
У меня есть метод класса ( bar
из app
примера ниже). Я хочу, чтобы метод with вызывался автоматически, я имею в виду без условного оператора, например if
, перегруженных функций ( create
в примере). Какая функция для вызова не может быть известна во время компиляции, поскольку она зависит от аппаратного ввода (пользовательского ввода в примере). В моем примере базовый класс b
и производные классы d1
и d2
не могут быть изменены. В контексте реального кода они в основном являются частью аппаратного драйвера.
#include <iostream>
class b
{
virtual void foo() = 0;
};
class d1 : public b
{
void foo() override {};
};
class d2 : public b
{
void foo() override {};
};
class app
{
int create(d1 amp; p1){return 1;}
int create(d2 amp; p2){return 2;}
public:
app()
{
}
void bar(b * p)
{
::std::cout<<this->create(*p)<<::std::endl;
}
};
int main()
{
b * either1or2;
auto input(0);
::std::cin>>input;
if(input % 2 == 0)
{
either1or2 = new d1;
}
else
{
either1or2 = new d2;
}
app a;
a.bar(either1or2);
return 0;
}
То, что я написал, неверно, потому что это требует знаний во время компиляции.
::std::cout<<this->create(*p)<<::std::endl;
Это должно быть что-то вроде
::std::cout<<this->create(*dynamic_cast< decltype(*p) * >(p))<<::std::endl;
Но та же проблема возникает из-за того, что decltype вычисляется во время компиляции.
Комментарии:
1. Понижающая обработка — это то, что вы редко хотите делать. Я не думаю, что вы можете делать то, что хотите, таким образом.
2. Я должен быть в безопасности в этом контексте, потому что понижение будет выведено по указанному значению. Но я согласен, что я не уверен, что это возможно, вот почему я спрашиваю ^^
3. Разрешение перегрузки всегда выполняется во время компиляции. Лучшее, что вы можете сделать во время выполнения, это выбрать между различными операторами для выполнения.