Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

шаблон + полиморфизм

1.9K
10 марта 2009 года
smax13
63 / / 03.08.2004
привет! нужна помощь.

среда разработки - 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 () ) не получается.

вопрос: возможно ли в принципе реализовать данную модель.
т.е. в общем виде, возможно ли с помощью конструкций языка С++ использовать указатель
на НЕ-конкретизированный базовый класс шаблона для вызова методов производного.

заранее благодарен.
5
10 марта 2009 года
hardcase
4.5K / / 09.08.2005
Нельзя. Для таких случаев нужно создавать интерфейс (например, IDerived) с требуемыми методами и реализовывать его в CDerived, далее держать ссылку уже на этот интерфейс и вызвать методы через него.
1.9K
10 марта 2009 года
smax13
63 / / 03.08.2004
уважаемый, hardcase!
огромное спасибо за то, что наставили меня на путь истинный. я идиот - не догадался.

с уважением.
87
10 марта 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: smax13
уважаемый, hardcase!
огромное спасибо за то, что наставили меня на путь истинный. я идиот - не догадался.


Не ясно: поблагодарил или возмутился...
Но вообще, hardcase прав. Можно реализовать так, например:

Код:
// базовый класс;
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;
    }
};
1.9K
10 марта 2009 года
smax13
63 / / 03.08.2004
уважаемый Kogrom!
я поблагодарил hardcase. то что он предложит - логичный вариант реализации модели.
идиот - это я. это ситуация, типа "думать около", т.е. данное решение очевидно, однако
я не смог до него дойти самостоятельно (голова просто от работы трещит по швам).
вам тоже спасибо за ясный пример, хотя лично для меня ответа hardcase было достаточно.

с уважением.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог