Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
8 / 8 / 1
Регистрация: 01.07.2012
Сообщений: 138
1

Чисто вирутальные функции в шаблонном классе

02.08.2012, 08:09. Просмотров 638. Ответов 10
Метки нет (Все метки)

Хотелось бы узнать, поддерживает ли это свойство Visual C++ 2010.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2012, 08:09
Ответы с готовыми решениями:

Перегрузка операторов из дружеской функции в шаблонном классе
Скомпилировал http://dmtsoft.ru/bn/370/as/oneaticleshablon/. Как только перенёс в свой шаблонный...

Ошибка в шаблонном классе
Помогите исправить ошибку в 12 строчке: error C2248: CMyClass<T>::m_value: невозможно обратиться к...

Ошибки в шаблонном классе
Добрый день. Реализовал класс динамического массива. При проверке его работы столкнулся с ошибками,...

Параметры в шаблонном классе
Почему в шаблонном классе при описании функции надо два раза указывать тип параметра? В 1-ой...

10
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
02.08.2012, 09:13 2
Напишите и проверьте
У меня в MSVS2008Express нормально собралось такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//файл templtate.h
template <class T>
class Abstract
{
public:
    virtual T func(T) = 0;
};
 
template <class T>
class Template
{
public:
    virtual T func(T t)
    {
        T a = t + t;
        return a;
    }
};
C++
1
2
3
4
5
6
7
8
9
10
//файл main.cpp
#include "template.h"
#include <iostream>
 
void main(void)
{
    Template<int> A;
    std::cout << A.func(3);
    return;
}
Вы это имели ввиду?
0
8 / 8 / 1
Регистрация: 01.07.2012
Сообщений: 138
02.08.2012, 10:14  [ТС] 3
А где же там наследование от асбстрактного класса?
0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
02.08.2012, 10:25 4
Пардоньте вот исправленный код, у меня компилируется и работает. Проверьте у себя.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//файл templtate.h
template <class T>
class Abstract
{
public:
    virtual T func(T) = 0;
};
 
template <class T>
class Template: public Abstract<T>
{
public:
    virtual T func(T t)
    {
        T a = t + t;
        return a;
    }
};
C++
1
2
3
4
5
6
7
8
9
10
//файл main.cpp
#include "template.h"
#include <iostream>
 
void main(void)
{
    Template<int> A;
    std::cout << A.func(3);
    return;
}
1
8 / 8 / 1
Регистрация: 01.07.2012
Сообщений: 138
02.08.2012, 10:54  [ТС] 5
Да так работает, спасибо.
0
Модератор
Эксперт С++
9801 / 8363 / 5091
Регистрация: 18.12.2011
Сообщений: 22,372
02.08.2012, 11:02 6
Чтобы виртуальный механизм сработал main() должна выглядеть так
C++
1
2
3
4
5
6
7
void main(void)
{
    Abstract<int>* A=new Template<int>;
    std::cout << A->func(3);
    delete A;
    return;
}
0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
02.08.2012, 11:32 7
Ну кстати да, важное замечание.
Но и так тоже работает
0
Модератор
Эксперт С++
9801 / 8363 / 5091
Регистрация: 18.12.2011
Сообщений: 22,372
02.08.2012, 13:11 8
Цитата Сообщение от John Prick Посмотреть сообщение
Но и так тоже работает
Так не работает.
Можете вообще убрать базовый класс и ничего не изменится
(функция вызывается не как виртуальная,
а как обычная функция - член класса Template).
0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
02.08.2012, 14:57 9
Цитата Сообщение от zss Посмотреть сообщение
Так не работает.
Не совсем тогда понимаю, как это можно проверить.
Давайте добавим реализацию в базовый класс и ещё один класс-наследник. Пусть тогда будет так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//файл templtate.h
template <class T>
class Abstract
{
public:
    virtual T func(T t) = 0
    {
        T a = t + t + t;
        return a;
    };
};
 
template <class T>
class Template: public Abstract<T>
{
public:
    virtual T func(T t)
    {
        T a = t + t;
        return a;
    }
};
 
template <class T>
class Template_2: public Abstract<T>
{
public:
    virtual T func(T t)
    {
        T a = -t;
        return a;
    }
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//файл main.cpp
#include "template.h"
#include <iostream>
 
void func(Abstract<int> * X)
{
    std::cout << X->func(3) << ' ' << X->Abstract<int>::func(3) << std::endl;
}
 
void main(void)
{
    Abstract<int>* A = new Template<int>;
    Abstract<int>* B = new Template_2<int>;
    func(A);
    func(B);
    delete A;
    return;
}
Компилируется, работает ожидаемым образом. Почему вы говорите, что не работает?
0
Модератор
Эксперт С++
9801 / 8363 / 5091
Регистрация: 18.12.2011
Сообщений: 22,372
02.08.2012, 16:31 10
У Вас изначально было:
Цитата Сообщение от John Prick Посмотреть сообщение
Template<int> A;
Т.е. указателя или ссылки на базовый класс не было,
а это обязательно для реализации виртуального механизма.
0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
02.08.2012, 16:59 11
Цитата Сообщение от zss Посмотреть сообщение
У Вас изначально было:
Template<int> A;
Т.е. указателя или ссылки на базовый класс не было,
Да, с этим я согласился и исправил. И оно (исправленное) работает, говорю же. А значит чисто виртуальные функции в шаблонных классах быть могут.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2012, 16:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Итератор в шаблонном классе
итератор в шаблонном классе?

String в шаблонном классе
Как сделать так, чтобы в Map&lt;int, std::string&gt; A; работало со string'ом С интами чарами и т.д. все...

Найти ошибки в шаблонном классе
Пишу шаблонный класс в Qt, и, конечно же, на моих любимых шаблонах не обошлось без проблем :(....

typedef в шаблонном классе фыв
Есть некий шаблонный класс с typedef'ом, и функция которая возвращает тип описанный typedef: ......


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.