// базовый класс;
class IBase
{
public:
virtual void method1() = 0;
virtual void method2() = 0;
};
template < class T >
class CBase : public IBase
{
public:
virtual void method1 () { /* использовать поле data;*/ }
virtual void method2 () = 0;
private:
T data;
};
// производный класс;
template < class T >
class CDerived : public CBase < T >
{
public:
void method2 () { /* что-то сделать;*/ }
};
class CSomeClass
{
private:
IBase *instance;
public:
void useInstance()
{
instance->method2();
}
void SetInstance(IBase *inst)
{
instance = inst;
}
};
шаблон + полиморфизм
среда разработки - MS VisualStudio 6.0.
допустим, существует абстрактный базовый класс-шаблон с некоторым набором
методов, реализующих общую логику объектов класса, плюс некоторыми виртуальными
методами, переопределенными в производных классах.
// базовый класс;
template < class T >
class CBase {
public:
virtual void method1 () { // использовать поле data; }
virtual void method2 ();
private:
T data;
};
// производный класс;
template < class T >
class CDerived : public CBase < T > {
public:
void method2 () { // что-то сделать; }
};
также должен существовать класс, содержащий указатель на экземпляр класса, производного
от CBase ( например, CDerived ).
class CSomeClass {
private:
CBase * instance;
public:
void useInstance () { instance -> method2 (); }
};
ПРИЧЕМ, ЭТОМУ УКАЗАТЕЛЮ В ХОДЕ ИСПОЛНЕНИЯ ПРОГРАММЫ
МОЖЕТ БЫТЬ ПРИСВОЕНЫ АДРЕСА ЭКЗЕМПЛЯРОВ CDerived, КОНКРЕТИЗИРОВАННЫХ РАЗЛИЧНЫМИ ТИПАМИ.
я пытался данную модель реализовать, используя приведение типов, но, все равно,
без указания типов вызвывать метод через экземпляр производного класса
( instance -> method2 () ) не получается.
вопрос: возможно ли в принципе реализовать данную модель.
т.е. в общем виде, возможно ли с помощью конструкций языка С++ использовать указатель
на НЕ-конкретизированный базовый класс шаблона для вызова методов производного.
заранее благодарен.
Нельзя. Для таких случаев нужно создавать интерфейс (например, IDerived) с требуемыми методами и реализовывать его в CDerived, далее держать ссылку уже на этот интерфейс и вызвать методы через него.
огромное спасибо за то, что наставили меня на путь истинный. я идиот - не догадался.
с уважением.
Цитата: smax13
уважаемый, hardcase!
огромное спасибо за то, что наставили меня на путь истинный. я идиот - не догадался.
огромное спасибо за то, что наставили меня на путь истинный. я идиот - не догадался.
Не ясно: поблагодарил или возмутился...
Но вообще, hardcase прав. Можно реализовать так, например:
Код:
я поблагодарил hardcase. то что он предложит - логичный вариант реализации модели.
идиот - это я. это ситуация, типа "думать около", т.е. данное решение очевидно, однако
я не смог до него дойти самостоятельно (голова просто от работы трещит по швам).
вам тоже спасибо за ясный пример, хотя лично для меня ответа hardcase было достаточно.
с уважением.