Один класс возвращает 'int', другой возвращает 'double'. Что такое подпись метода «GiveMeTheValue» в интерфейсе обоих классов. Я хочу скомпилировать следующий код:Возвращаемое значение виртуальных функций в интерфейсе
class Interface
{
public:
virtual arbitrary_type GimeMeTheValue(void) {};
};
class TakeInt : public Interface
{
public:
arbitrary_type GimeMeTheValue(void) {
return 10;
}
};
class TakeDouble : public Interface
{
public:
arbitrary_type GimeMeTheValue(void) {
return 3.14;
}
};
int main()
{
Interface * obj;
obj = new TakeInt();
cout << obj -> GimeMeTheValue() << endl; // It's 10, thank you
obj = new TakeDouble();
cout << obj -> GimeMeTheValue() << endl; // Oh it's 3.14, I love you c++
}
Конечно нет такой «arbitary_type». Это работает ...
class Interface
{
public:
virtual void * GimeMeTheValue(void) {};
};
class TakeInt : public Interface
{
public:
void * GimeMeTheValue(void) {
int value = 10;
int * ptr = &value;
return ptr;
}
};
class TakeDouble : public Interface
{
public:
void * GimeMeTheValue(void) {
double value = 3.14;
double * ptr = &value;
return ptr;
}
};
int main()
{
Interface * obj;
obj = new TakeInt();
cout << *((int *) (obj -> GimeMeTheValue())) << endl;
obj = new TakeDouble();
cout << *((double *) (obj -> GimeMeTheValue())) << endl;
}
Это довольно сложно иметь дело с «недействительным *». Существуют ли какие-либо другие идеи для реализации чего-то простого (например, в первом примере кода)? Спасибо.
Вы возвращаете указатели на локальные переменные. Никогда не делай этого :-). – AlexD
'virtual void * GimeMeTheValue (void) {};' * does not * puke предупреждение компилятора о том, чтобы не возвращать значение? Это * кажется * достойным кандидатом для типа * variant *. Как написано, это вызывает неопределенное поведение в нескольких местах – WhozCraig
AlexD, конечно!) – Pleeea