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

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

Войти
Регистрация
Восстановить пароль
 
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
#1

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

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

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++):

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

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

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

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

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

Ввести натуральное число и определить, верно ли, что в его записи есть две одинаковые цифры (не обязательно ст - C++
Ввести натуральное число и определить, верно ли, что в его записи есть две одинаковые цифры (не обязательно стоящие рядом) Пример: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kasan
Чорумфанин
337 / 337 / 185
Регистрация: 06.03.2014
Сообщений: 881
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
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.03.2014, 19:51 #4
Цитата Сообщение от edwvee Посмотреть сообщение
С чего оно должно компилиться???
Имплементация нужна только в том случае, если функция реально вызывается (или создаётся ситуация, когда она может быть вызвана).
kasan
Чорумфанин
337 / 337 / 185
Регистрация: 06.03.2014
Сообщений: 881
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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
10.03.2014, 19:56 #7
Цитата Сообщение от edwvee Посмотреть сообщение
Так все же одно ли это и то же?
нет
Цитата Сообщение от edwvee Посмотреть сообщение
Кажется понял, в случае =0 не получится создать объект данного класса.
да
если хоть одна виртуальная функция =0 , называется чисто виртуальная функция, то класс становится абстрактным
создать объект такого класса нельзя
Цитата Сообщение от edwvee Посмотреть сообщение
о на последней строчке компилятор ругается, что что-то не такая с таблицей виртуальных функций.
если ты все так и привел как в программе то ошибка вот
Цитата Сообщение от edwvee Посмотреть сообщение
virtual int func(){/*тут реализация метода*/}
нет точки с запятой в конце, после фигурной скобки
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.03.2014, 20:10 #8
Цитата Сообщение от edwvee Посмотреть сообщение
Зачем можно так?
Самый простой ответ - "а зачем запрещать"? Какой смысл заставлять программиста создавать функции, которые всё равно не используются? Есть такой принцип в разработке качественных компиляторов, "не платить за то, что не используешь". Так что даже написанную функцию всё равно выкинут, если она не используется. Практический смысл у неиспользуемых объявлений может быть разный, например - задел на будущее.

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

Доказать путем перебора возможных значений, что данные пары логических выражений эквивалентны - C++
Доказать (путем перебора возможных значений), что для любых величин А, В, С типа Boolean следующие пары логических выражений имеют...

Доказать (перебор) что для любых величин А, В, С типа Boolean следующие пары логических выражений эквивалентны - C++
Доказать (путем перебора возможных значений), что для любых величин А, В, С типа Boolean следующие пары логических выражений имеют...

Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы - C++
Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы Abiturient:...

Согласно бюллетеню Центробанка 100 евро эквивалентны Т руб. Вычислить эквивалент 2,3,4.N руб. в долларах - C++
Согласно бюллетеню Центробанка 100 евро эквивалентны Т руб. Вычислить эквивалент 2,3,4....N руб. в долларах.


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

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

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