Я новичок в C ++. Это моя первая работа с шаблонами. Я хочу определить какой-то интерфейс с чисто виртуальными функциями, но типы возврата этих функций могут различаться в зависимости от производных классов. Поэтому я подумал об использовании шаблона в абстрактном классе. Я не уверен, что то, что у меня есть, действительно. У меня есть что-то вроде:
template <class T> class InterfaceClass
{
public:
virtual T function1(const string& value)=0;
virtual T function2(const MyObj& p)=0;
}
Чтобы я мог наследовать от него и определить интерфейс для доступа к функциям.
class myClass : public InterfaceClass<MyObj>{
public:
MyObj InterfaceClass::function1(const string& value)
{
MyObj a = parse(value);
}
MyObj InterfaceClass::function2(const MyObj& p)
{
return p;
}
}
Цель в том, чтобы я хотел быть готовым сделать что-то вроде:
InterfaceClass * pClass;
if(isCertainType())
pClass = new myClass();
else
pClass = new myClass2();
Компилятор жалуется, что существует переопределение класса InterfaceClass
и что члены-функции не могут быть определены в myClass
, Я действительно смущен в данный момент и хотел бы знать, возможно ли это или что я делаю неправильно. Любая помощь высоко ценится.
Реальная проблема заключается в том, что когда вы наследуете от класса шаблона с разными аргументами одного и того же шаблона, ваши классы не имеют общего базового класса. (InterfaceClass<int>
а также InterfaceClass<double>
являются разные классы).
Что касается виртуалов, вам просто не нужно указывать имя класса при их определении.
Других решений пока нет …