Есть базовый абстрактный класс MyBase
.
Есть его подвариант содержащий функции работающие с типом определяемым в шаблоне. MyBaseT<T>
.
В обоих классах есть pure-методы.
Далее есть реальный класс MyExtended
наследующая MyBase
и реализующий все недостающие pure-методы.
И есть класс MyExtendedT<T>
наследующий MyExtended
и MyBaseT<T>
и реализующий pure-методы из MyBaseT<T>
.
Нужно это все чтобы можно было наплодить MyExtendedT1<T>
MyExtendedT2<T>
… MyExtendedTN<T>
и со всеми ними работать как с MyBaseT<T>
в общем случае.
Так же функции возвращающие значение T
нужны(да и возможны) далеко не всегда, и тогда можно пользоваться вариантами MyExtended1
, MyExtended2
.. MyExtendedN
с которыми в общем случае можно работать как с MyBase
.
Пытаюсь сделать я это примерно так
#include<stdio.h>
class MyBase
{
public:
virtual int SomeFunction() = 0; /*Not implemented at base class*/
};
template<class T> class MyBaseT: public MyBase
{
public:
virtual T TypeSpecificFunction() = 0; /*Not implemented at base class*/
};
class MyExtended: public MyBase
{
public:
virtual int SomeFunction() override;
};
int
MyExtended::SomeFunction()
{
printf("MyExtended::SomeFunction\n");
return 0;
}
template<class T> class MyExtendedT: public MyExtended, public MyBaseT<T>
{
public:
virtual T TypeSpecificFunction() override;
};
template<class T> T
MyExtendedT<T>::TypeSpecificFunction()
{
printf("MyExtendedT<T>::TypeSpecificFunction\n");
return 0;
}
int main()
{
MyExtendedT<int> obj;
obj.SomeFunction();
}
И у меня не получается. Оно почему-то считает, что получившийся MyExtendedT – абстрактный класс, и метод TypeSpecificFunction pure-метод
test.cpp: In function ‘int main()’:
test.cpp:46:22: error: cannot declare variable ‘obj’ to be of abstract type ‘MyExtendedT<int>’
MyExtendedT<int> obj;
^~~
test.cpp:30:25: note: because the following virtual functions are pure within ‘MyExtendedT<int>’:
template<class T> class MyExtendedT: public MyExtended, public MyBaseT<T>
^~~~~~~~~~~
test.cpp:6:17: note: ‘virtual int MyBase::SomeFunction()’
virtual int SomeFunction() = 0; /*Not implemented at base class*/
^~~~~~~~~~~~
test.cpp:47:9: error: request for member ‘SomeFunction’ is ambiguous
obj.SomeFunction();
^~~~~~~~~~~~
test.cpp:6:17: note: candidates are: ‘virtual int MyBase::SomeFunction()’
virtual int SomeFunction() = 0; /*Not implemented at base class*/
^~~~~~~~~~~~
test.cpp:23:1: note: ‘virtual int MyExtended::SomeFunction()’
MyExtended::SomeFunction()
^~~~~~~~~~
MyExtended::SomeFunction
Я что-то делаю не так? А как надо?
Или я хочу того что нельзя? Можно ли тогда добиться похожего эффекта другим способом?