Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
edwvee
20 / 20 / 2
Регистрация: 27.01.2014
Сообщений: 232
1

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

10.03.2014, 18:58. Просмотров 268. Ответов 7
Метки нет (Все метки)

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

Методы защиты данных от записи во время выполнения участка кода?
День добрый, форумчане. Вводные данные: - Весь свой код строю на работе с...

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

Проверить, есть ли в десятичной записи заданного натурального числа две единицы подряд
Циклы с предусловием и с постусловием (while; do ... while) Дано натуральное...

Добавить в программу две функции: для считывания и записи данных в файл в бинарном режиме
Усовершенствовать программу дополнив две функции: для считывания и записи...

Подсчитать количество трехзначных натуральных чисел, в записи которых есть две одинаковые цифры
Подсчитать количество трехзначных натуральных чисел, в записи которых есть две...

7
kasan
Чорумфанин
338 / 339 / 319
Регистрация: 06.03.2014
Сообщений: 893
10.03.2014, 19:09 2
Цитата Сообщение от edwvee Посмотреть сообщение
int func(){}
метод класса

Цитата Сообщение от edwvee Посмотреть сообщение
int func() = 0;
Похоже на виртуальнyю функцию, которая делет класс абстрактным
C++
1
virtual void func()=0;
1
edwvee
20 / 20 / 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
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.03.2014, 19:51 4
Цитата Сообщение от edwvee Посмотреть сообщение
С чего оно должно компилиться???
Имплементация нужна только в том случае, если функция реально вызывается (или создаётся ситуация, когда она может быть вызвана).
0
kasan
Чорумфанин
338 / 339 / 319
Регистрация: 06.03.2014
Сообщений: 893
10.03.2014, 19:54 5
Цитата Сообщение от edwvee Посмотреть сообщение
Попробовал функции не методы классов делать без имплементации
т.е. делал что-то типа
C++
1
2
3
4
5
int func();
 
class A
{
};
если да, то с чего бы ему не компилить? ты же просто объявляешь протитип функции и все.
если в main() объявить int a и нигде его не использовать то тоже все скомпилит.
0
edwvee
20 / 20 / 2
Регистрация: 27.01.2014
Сообщений: 232
10.03.2014, 19:54  [ТС] 6
Имплементация нужна только в том случае, если функция реально вызывается (или создаётся ситуация, когда она может быть вызвана).
Это я понял. Пытаюсь понять смысл декларации функции не метода класса без имплементации. Зачем можно так?
0
ValeryS
Модератор
7266 / 5520 / 692
Регистрация: 14.02.2011
Сообщений: 18,711
10.03.2014, 19:56 7
Цитата Сообщение от edwvee Посмотреть сообщение
Так все же одно ли это и то же?
нет
Цитата Сообщение от edwvee Посмотреть сообщение
Кажется понял, в случае =0 не получится создать объект данного класса.
да
если хоть одна виртуальная функция =0 , называется чисто виртуальная функция, то класс становится абстрактным
создать объект такого класса нельзя
Цитата Сообщение от edwvee Посмотреть сообщение
о на последней строчке компилятор ругается, что что-то не такая с таблицей виртуальных функций.
если ты все так и привел как в программе то ошибка вот
Цитата Сообщение от edwvee Посмотреть сообщение
virtual int func(){/*тут реализация метода*/}
нет точки с запятой в конце, после фигурной скобки
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.03.2014, 20:10 8
Цитата Сообщение от edwvee Посмотреть сообщение
Зачем можно так?
Самый простой ответ - "а зачем запрещать"? Какой смысл заставлять программиста создавать функции, которые всё равно не используются? Есть такой принцип в разработке качественных компиляторов, "не платить за то, что не используешь". Так что даже написанную функцию всё равно выкинут, если она не используется. Практический смысл у неиспользуемых объявлений может быть разный, например - задел на будущее.

Более глубокое изучение вопроса приведёт нас к раздельной компиляции, когда программа составляется из нескольких исходных файлов, содержащих разные части программы, которые компилируются независимо друг от друга. После этого получившиеся объектные файлы уже объединяются в итоговый исполняемый файл. Из одного исходного файла можно обращаться к функциям другого, для этого и нужны предварительные объявления, чтобы компилятор мог создать вызов, не имея доступа к самой вызываемой функции. В объектном файле уже не остаётся предварительных объявлений, там машинный код вперемешку со ссылками на внешние функции и переменные. Так что на этапе компиляции неизвестно, какие объявления останутся неиспользованными, а на этапе связывания остаются упоминания только об использованных функциях. Получается, что неиспользованные объявления отследить не получится, да и не нужно.
1
10.03.2014, 20:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 20:10

Сформировать массив B из чисел массива A[n], в записи которых встречаются две подряд идущие одинаковые цифры
Сформировать массив B из чисел массива A, в записи которых встречаются две...

Ввести целое число и определить, верно ли, что в его записи есть две одинаковые цифры
Задача на С++ (do..while) Нужно ввести целое число и определить, верно ли,...

Ввести натуральное число и определить, верно ли, что в его записи есть две одинаковые цифры (не обязательно ст
Ввести натуральное число и определить, верно ли, что в его записи есть две...


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

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

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