Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация виртуального метода в наследнике 
V
    Опции темы
boostcoder
Дата 19.7.2012, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



халоф пиплы!

сегодня был озадачен следующим.
имеем базовый абстрактный класс описанный в хидере base.hpp:
Код

struct base {
    virtual void m() = 0;
};


далее, наследуем его в класс derived, описанный в derived.hpp:
Код

#include "base.hpp"

struct derived: base {
    void m2();
};


и далее, пытаемся реализовать base::m() в наследнике в его .cpp файле:
Код

#include "derived.hpp"

void derived::m2() {}

void derived::m() {}

int main() {
    derived d;
}

то получаю:
Цитата

derived.cpp:6:17: error: no 'void derived::m()' member function declared in class 'derived'
derived.cpp: In function 'int main()':
derived.cpp:9:10: error: cannot declare variable 'd' to be of abstract type 'derived'
derived.hpp:4:8: note:   because the following virtual functions are pure within 'derived':
base.hpp:3:15: note:  virtual void base::m()


я чего-то недопонимаю? или что?

спасибо.



зы
если его реализовать прям внутри декларации derived - то все ок.

PM WWW   Вверх
Qu1nt
Дата 19.7.2012, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 1
Всего: 50



Ты забыл объявить метод m в derived.
PM MAIL   Вверх
boostcoder
Дата 19.7.2012, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Qu1nt, т.е. я должен продублировать декларации методов предка в наследнике?
а как же ODR?  smile 

PM WWW   Вверх
Randajad
Дата 19.7.2012, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



А оно к этому случаю относится? О.о
PM MAIL   Вверх
borisbn
Дата 19.7.2012, 22:07 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(boostcoder @  19.7.2012,  21:42 Найти цитируемый пост)
т.е. я должен продублировать декларации методов предка в наследнике?

 smile 
ващето не "должен", а "обязан"


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 19.7.2012, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



а двойная декларация одного и того же, разве не относится к ODR? oO

PM WWW   Вверх
mes
Дата 19.7.2012, 22:15 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



boostcoder, может в отпуск пора ? smile

Добавлено через 2 минуты и 2 секунды
Цитата(boostcoder @  19.7.2012,  21:08 Найти цитируемый пост)
 декларация одного и того же, разве не относится к ODR?

декларация (обьявление) может быть сколь угодно много раз.. это вот с определениями проблема..

Добавлено через 3 минуты и 36 секунд
ODR - one definition rule, not one declaration rule..


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.7.2012, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, пора. надеюсь со следующей недели выйду.
но все равно не понимаю, зачем мне дважды декларировать одни и те же методы smile 
допустим, в предке я изменю декларацию метода. так мне что, нужно во всех наследниках проделать то же самое? где логика?
PM WWW   Вверх
mes
Дата 19.7.2012, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  19.7.2012,  21:19 Найти цитируемый пост)
но все равно не понимаю, зачем мне дважды декларировать одни и те же методы

c++ потому что.. 


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.7.2012, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  19.7.2012,  22:15 Найти цитируемый пост)
ODR - one definition rule, not one declaration rule.

это я-то понимаю. но вод по логике, что-то тут не вяжется...

Добавлено через 1 минуту и 8 секунд
Цитата(mes @  19.7.2012,  22:21 Найти цитируемый пост)
c++ потому что.

аааа, ну да. так можно на любой вопрос по С++ ответить =)

в общем понял, что так оно и задумывалось.
всем спасибо.

PM WWW   Вверх
mes
Дата 19.7.2012, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  19.7.2012,  21:21 Найти цитируемый пост)
это я-то понимаю. но вод по логике, что-то тут не вяжется... 

ага - лишний труд )

Добавлено через 3 минуты и 13 секунд
Цитата(boostcoder @  19.7.2012,  21:21 Найти цитируемый пост)
аааа, ну да. так можно на любой вопрос по С++ ответить =)

но на этот по другому никак не ответить smile


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.7.2012, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  19.7.2012,  22:24 Найти цитируемый пост)
на этот по другому никак не ответить

 smile 
пора на D переходить. скоро в GCC добавят поддержку.

PM WWW   Вверх
bsa
Дата 19.7.2012, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(boostcoder @  19.7.2012,  23:32 Найти цитируемый пост)
пора на D переходить. скоро в GCC добавят поддержку.

Угу. Только осталось дождаться библиотек под него...
PM   Вверх
xvr
Дата 20.7.2012, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(boostcoder @  19.7.2012,  22:19 Найти цитируемый пост)
но все равно не понимаю, зачем мне дважды декларировать одни и те же методы

Они не одни и те же. Декларация derived::m говорит компилятору, что вы собираетесь перебить виртуальный метод m в наследнике. Без этой декларации и без самого модуля с реализацией компилятор не сможет правильно сформировать таблицу виртуальных методов класса derived в других модулях, где он используется

PM MAIL   Вверх
boostcoder
Дата 20.7.2012, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(xvr @  20.7.2012,  11:33 Найти цитируемый пост)
Декларация derived::m говорит компилятору, что вы собираетесь перебить виртуальный метод m в наследнике.

он чисто виртуальный. перебить его не получится до тех пор, пока он не реализован. на основании этого, компилятор точно знает что в наследнике происходит не переопределение, а реализация.

мне так думается...

PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0730 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.