Рассмотрим double
примитивный тип. Позвольте нам объявить функцию следующим образом:
void foo(double);
Можно ли описать пользовательский тип, который может быть передан foo
как параметр?
Конечно, хотя и не через фактический наследование, но путем симуляции с неявным преобразованием:
#include <iostream>
struct MoreDouble
{
operator double() { return 42.5; }
};
void foo(double x)
{
std::cout << x << '\n';
}
int main()
{
MoreDouble md;
foo(md);
}
// Output: 42.5
Является ли это хорошей идеей, это другой вопрос. Мне вообще не нравятся неявные преобразования, поэтому убедитесь, что они вам действительно нужны, прежде чем их использовать.
Да, вы можете сделать это, если есть пользователь, определяющий оператор приведения к вашему типу.
void x(double){}
class A
{
public:
operator double(){return 0;}
};
int main()
{
A a;
x(a);
return 0;
}