Как иметь виртуальные функции, которые возвращают разные типы в зависимости от класса, к которому он принадлежит, без включения фиктивной реализации в Base?

Мне нужна иерархия классов, в которой производные классы будут иметь реализацию виртуальной функции, которая отличается по типу возвращаемого значения. Как мне это сделать. То, что я пробовал, это следующий код:

using namespace std;
class Base
{
public:
Base()
{
cout<<"Constructor of Base"<<endl;
}
virtual Base& Decode()=0;
virtual operator int(){return -1;}
virtual operator string(){return "WRONG";}
};
class Der1:public Base
{
int i;
public:
Der1(int j=0):Base(),i(j)
{
cout<<"COnstructor of Der1"<<endl;
}
Base& Decode()
{
cout<<"Decode in Der1"<<endl;
return *this;
}
operator int()
{
return i;
}
};
class Der2:public Base
{
string s;
public:
Der2(string temp="sajas"):Base(),s(temp)
{
cout<<"Constructor of Der2"<<endl;
}
Base& Decode()
{
cout<<"Decode in Der2"<<endl;
return *this;
}
operator string()
{
return s;
}
};
int main()
{
Base *p=new Der1();
int val=p->Decode();
}

Я думал, если бы это могло работать таким образом, пользователю просто нужно было бы приравнять объект к допустимой переменной. Есть ли способ сделать это без включения всех операторов преобразования в Base с помощью некоторой фиктивной реализации?

1

Решение

Я предполагаю, что есть одна проблема, если это виртуальная функция Pure, вы не можете создать объект из базы классов. Но с другой стороны, чтобы решить вашу проблему, вы можете попробовать использовать шаблоны, как показано ниже.

#include <iostream>

class Base{
public:
Base(){}
virtual ~Base(){}
virtual void show() const {
std::cout << "Base::show()!" << std::endl;
}
};
class A:public Base{
public:
A(){}
virtual ~A(){}
virtual void show() const{
std::cout << "A::show()!" << std::endl;
}
};

template<typename T>
class Factory{
public:
const T* operator()() const{
return &t;
}
private:
T t;
};

int main(){
const A* pA = Factory<A>()();
pA->show();
Factory<A>()()->show();
return 0;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]