Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
#1

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

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

Хотелось бы узнать, поддерживает ли это свойство Visual C++ 2010.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2012, 08:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чисто вирутальные функции в шаблонном классе (C++):

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

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

String в шаблонном классе - C++
Как сделать так, чтобы в Map<int, std::string> A; работало со string'ом С интами чарами и т.д. все хорошо работает, а на string прога...

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

Работа с матрицей в шаблонном классе - C++
Часть работы разобрал, не получается сделать такое задание как: создать метод который дает возможность изменять кол-во строк или столбцов...

Статическая функция в шаблонном классе - C++
Под windows все отлично работало, но под linux выдает ошибку : /home/stalker/Рабочий стол/H-Array/Homework_Array/Array.h:121: ошибка:...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
02.08.2012, 10:14  [ТС] #3
А где же там наследование от асбстрактного класса?
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
02.08.2012, 10:54  [ТС] #5
Да так работает, спасибо.
0
zss
Модератор
Эксперт С++
6380 / 5945 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
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
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
02.08.2012, 11:32 #7
Ну кстати да, важное замечание.
Но и так тоже работает
0
zss
Модератор
Эксперт С++
6380 / 5945 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
02.08.2012, 13:11 #8
Цитата Сообщение от John Prick Посмотреть сообщение
Но и так тоже работает
Так не работает.
Можете вообще убрать базовый класс и ничего не изменится
(функция вызывается не как виртуальная,
а как обычная функция - член класса Template).
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
zss
Модератор
Эксперт С++
6380 / 5945 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
02.08.2012, 16:31 #10
У Вас изначально было:
Цитата Сообщение от John Prick Посмотреть сообщение
Template<int> A;
Т.е. указателя или ссылки на базовый класс не было,
а это обязательно для реализации виртуального механизма.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
02.08.2012, 16:59 #11
Цитата Сообщение от zss Посмотреть сообщение
У Вас изначально было:
Template<int> A;
Т.е. указателя или ссылки на базовый класс не было,
Да, с этим я согласился и исправил. И оно (исправленное) работает, говорю же. А значит чисто виртуальные функции в шаблонных классах быть могут.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2012, 16:59
Привет! Вот еще темы с ответами:

Найти ошибки в шаблонном классе - C++
Пишу шаблонный класс в Qt, и, конечно же, на моих любимых шаблонах не обошлось без проблем :(. Структура кода стандартная - *.h + *.cpp. В...

Шаблонный конструктор в шаблонном классе - C++
Не получается определить этот конструктор. Класс шаблонный и еще конструктор тоже шаблонный Подскажите как правильно сделать ...

Конструктор копирования в шаблонном классе - C++
//Header.h #include &lt;iostream&gt; #include &lt;conio.h&gt; #define NULL 0 template &lt;typename T&gt; class Laser { ...

typedef в шаблонном классе фыв - C++
Есть некий шаблонный класс с typedef'ом, и функция которая возвращает тип описанный typedef: ... template&lt;class T&gt; class Blablabla...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.08.2012, 16:59
Ответ Создать тему
Опции темы

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