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

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

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

Перегрузка операторов из дружеской функции в шаблонном классе C++
C++ Параметры в шаблонном классе
C++ Ошибка в шаблонном классе
C++ typedef в шаблонном классе фыв
C++ Найти ошибки в шаблонном классе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 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;
}
Вы это имели ввиду?
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
02.08.2012, 10:14  [ТС]     Чисто вирутальные функции в шаблонном классе #3
А где же там наследование от асбстрактного класса?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 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;
}
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
02.08.2012, 10:54  [ТС]     Чисто вирутальные функции в шаблонном классе #5
Да так работает, спасибо.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 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;
}
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
02.08.2012, 11:32     Чисто вирутальные функции в шаблонном классе #7
Ну кстати да, важное замечание.
Но и так тоже работает
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 1
02.08.2012, 13:11     Чисто вирутальные функции в шаблонном классе #8
Цитата Сообщение от John Prick Посмотреть сообщение
Но и так тоже работает
Так не работает.
Можете вообще убрать базовый класс и ничего не изменится
(функция вызывается не как виртуальная,
а как обычная функция - член класса Template).
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 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;
}
Компилируется, работает ожидаемым образом. Почему вы говорите, что не работает?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 1
02.08.2012, 16:31     Чисто вирутальные функции в шаблонном классе #10
У Вас изначально было:
Цитата Сообщение от John Prick Посмотреть сообщение
Template<int> A;
Т.е. указателя или ссылки на базовый класс не было,
а это обязательно для реализации виртуального механизма.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2012, 16:59     Чисто вирутальные функции в шаблонном классе
Еще ссылки по теме:

Работа с матрицей в шаблонном классе C++
C++ Статическая функция в шаблонном классе
C++ Конструктор копирования в шаблонном классе

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

Или воспользуйтесь поиском по форуму:
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
02.08.2012, 16:59     Чисто вирутальные функции в шаблонном классе #11
Цитата Сообщение от zss Посмотреть сообщение
У Вас изначально было:
Template<int> A;
Т.е. указателя или ссылки на базовый класс не было,
Да, с этим я согласился и исправил. И оно (исправленное) работает, говорю же. А значит чисто виртуальные функции в шаблонных классах быть могут.
Yandex
Объявления
02.08.2012, 16:59     Чисто вирутальные функции в шаблонном классе
Ответ Создать тему
Опции темы

Текущее время: 19:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru