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

Методы. Эквивалентны ли две записи - C++

Восстановить пароль Регистрация
 
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
10.03.2014, 18:58     Методы. Эквивалентны ли две записи #1
C++
1
2
3
4
class A
{
    int func(){}
};
C++
1
2
3
4
class A
{
    int func() = 0;
};
То ли раньше не обращал внимания, то ли не встречался со второй записью. Эти два кода эквиваленты?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2014, 18:58     Методы. Эквивалентны ли две записи
Посмотрите здесь:

C++ Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы
C++ В две строчки записать две цифры, а потом по закрытии программы и повторном открытии прочитать каждое число в отдельную переменную?
C++ Создать класс Triad (тройка чисел) - определить методы; определить производный класс Date - переопределить методы
C++ Согласно бюллетеню Центробанка 100 евро эквивалентны Т руб. Вычислить эквивалент 2,3,4.N руб. в долларах
C++ Дано натуральное число n. Проверить есть ли в записи числа две тройки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kasan
Чорумфанин
337 / 337 / 185
Регистрация: 06.03.2014
Сообщений: 872
10.03.2014, 19:09     Методы. Эквивалентны ли две записи #2
Цитата Сообщение от edwvee Посмотреть сообщение
int func(){}
метод класса

Цитата Сообщение от edwvee Посмотреть сообщение
int func() = 0;
Похоже на виртуальнyю функцию, которая делет класс абстрактным
C++
1
virtual void func()=0;
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
10.03.2014, 19:30  [ТС]     Методы. Эквивалентны ли две записи #3
Да не проверил, без virtual не работает.
А тем не менее, если дописать словать virtual. То какая-то разница будет?
Просто если допустим:
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:    
    virtual int func();
};
 
class B: public A
{
public:   
    virtual int func(){/*тут реализация метода*/}
}
Потом где либо:
C++
1
2
3
 A* a;
a = new B();
a->func();
То на последней строчке компилятор ругается, что что-то не такая с таблицей виртуальных функций. А если в классе A написать virtual int func() = 0;, то видимо с таблицей виртуальных функций все в порядке, как и если virtual int func() {}
Так все же одно ли это и то же?

Добавлено через 11 минут
Кажется понял, в случае =0 не получится создать объект данного класса. А vitrual func(); без имплементации видимо и есть функция без имплементации.
Попробовал функции не методы классов делать без имплементации, только декларация. Скомпилилось. С чего оно должно компилиться??? Использую gcc
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
10.03.2014, 19:51     Методы. Эквивалентны ли две записи #4
Цитата Сообщение от edwvee Посмотреть сообщение
С чего оно должно компилиться???
Имплементация нужна только в том случае, если функция реально вызывается (или создаётся ситуация, когда она может быть вызвана).
kasan
Чорумфанин
337 / 337 / 185
Регистрация: 06.03.2014
Сообщений: 872
10.03.2014, 19:54     Методы. Эквивалентны ли две записи #5
Цитата Сообщение от edwvee Посмотреть сообщение
Попробовал функции не методы классов делать без имплементации
т.е. делал что-то типа
C++
1
2
3
4
5
int func();
 
class A
{
};
если да, то с чего бы ему не компилить? ты же просто объявляешь протитип функции и все.
если в main() объявить int a и нигде его не использовать то тоже все скомпилит.
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
10.03.2014, 19:54  [ТС]     Методы. Эквивалентны ли две записи #6
Имплементация нужна только в том случае, если функция реально вызывается (или создаётся ситуация, когда она может быть вызвана).
Это я понял. Пытаюсь понять смысл декларации функции не метода класса без имплементации. Зачем можно так?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
10.03.2014, 19:56     Методы. Эквивалентны ли две записи #7
Цитата Сообщение от edwvee Посмотреть сообщение
Так все же одно ли это и то же?
нет
Цитата Сообщение от edwvee Посмотреть сообщение
Кажется понял, в случае =0 не получится создать объект данного класса.
да
если хоть одна виртуальная функция =0 , называется чисто виртуальная функция, то класс становится абстрактным
создать объект такого класса нельзя
Цитата Сообщение от edwvee Посмотреть сообщение
о на последней строчке компилятор ругается, что что-то не такая с таблицей виртуальных функций.
если ты все так и привел как в программе то ошибка вот
Цитата Сообщение от edwvee Посмотреть сообщение
virtual int func(){/*тут реализация метода*/}
нет точки с запятой в конце, после фигурной скобки
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 20:10     Методы. Эквивалентны ли две записи
Еще ссылки по теме:

C++ Ввести целое число и определить, верно ли, что в его записи есть две одинаковые цифры
Сформировать массив B из чисел массива A[n], в записи которых встречаются две подряд идущие одинаковые цифры C++
Доказать путем перебора возможных значений, что данные пары логических выражений эквивалентны C++

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
10.03.2014, 20:10     Методы. Эквивалентны ли две записи #8
Цитата Сообщение от edwvee Посмотреть сообщение
Зачем можно так?
Самый простой ответ - "а зачем запрещать"? Какой смысл заставлять программиста создавать функции, которые всё равно не используются? Есть такой принцип в разработке качественных компиляторов, "не платить за то, что не используешь". Так что даже написанную функцию всё равно выкинут, если она не используется. Практический смысл у неиспользуемых объявлений может быть разный, например - задел на будущее.

Более глубокое изучение вопроса приведёт нас к раздельной компиляции, когда программа составляется из нескольких исходных файлов, содержащих разные части программы, которые компилируются независимо друг от друга. После этого получившиеся объектные файлы уже объединяются в итоговый исполняемый файл. Из одного исходного файла можно обращаться к функциям другого, для этого и нужны предварительные объявления, чтобы компилятор мог создать вызов, не имея доступа к самой вызываемой функции. В объектном файле уже не остаётся предварительных объявлений, там машинный код вперемешку со ссылками на внешние функции и переменные. Так что на этапе компиляции неизвестно, какие объявления останутся неиспользованными, а на этапе связывания остаются упоминания только об использованных функциях. Получается, что неиспользованные объявления отследить не получится, да и не нужно.
Yandex
Объявления
10.03.2014, 20:10     Методы. Эквивалентны ли две записи
Ответ Создать тему
Опции темы

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