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

Как избежать не нужной пустой реализации виртуальных методов в базовом классе? - C++

Восстановить пароль Регистрация
 
FarStar
Заблокирован
27.06.2013, 17:24     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #1
Для наглядности:
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
class BASE
{
    public:
        BASE();
        ~BASE();
 
        virtual void Do();
 
        void NonVirtual();
};
 
//ДЛЯ ВИРТУАЛЬНОЙ ФУНКЦИИ Do ПРИХОДИТСЯ ДЕЛАТЬ ВСЕГДА
//ПУСТУЮ РЕАЛИЗАЦИЮ ТИПА:
void BASE::Do()
{
 
}
//Иначе ошибка типа: error LNK2001: unresolved external symbol "public: virtual void __thiscall BASE::Do(void)" (?Do@BASE@@UAEXXZ)
//МНЕ НЕ НУЖНА РЕАЛИЗАЦИЯ ЭТОЙ ФУНКЦИИ В БАЗОВОМ КЛАССЕ, Я ЕЁ РЕАЛИЗУЮ ВЕЗДЕ ПО РАЗНОМУ В НАСЛЕДНИКАХ!
 
class CHILD : public BASE
{
    public:
        CHILD();
        ~CHILD();
 
        void Do();
};
ну собственно вопрос в том, как избежать этой реализации? Можно сделать чисто виртуальной, но у меня в базовом классе есть и не виртуальные методы и мне нужен объект базового класса - так что не прокатит.... помогите нубасу
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2013, 17:24     Как избежать не нужной пустой реализации виртуальных методов в базовом классе?
Посмотрите здесь:

Создать массив в базовом абстрактном классе, и его передать функциям производных классов C++
C++ Указатель на потомка в базовом классе.
C++ Что такое порядок инициализации таблицы виртуальных методов?
C++ Описание чисто виртуальных методов, Абстрактные классы
Назначение виртуальных методов класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MarVaL
С++ Beginner
 Аватар для MarVaL
116 / 116 / 16
Регистрация: 28.02.2013
Сообщений: 246
27.06.2013, 17:31     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #2
Может её просто не объявлять в базовом?)
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
27.06.2013, 17:32     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #3
C++
1
virtual void Do() = 0;
MarVaL
С++ Beginner
 Аватар для MarVaL
116 / 116 / 16
Регистрация: 28.02.2013
Сообщений: 246
27.06.2013, 17:33     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #4
Цитата Сообщение от Герц Посмотреть сообщение
C++
1
virtual void Do() = 0;
Тогда он не сможет создать объект базового
FarStar
Заблокирован
27.06.2013, 17:36  [ТС]     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #5
Цитата Сообщение от MarVaL Посмотреть сообщение
Может её просто не объявлять в базовом?)
дело в том, что я обращаюсь к этой функции во всех дочках типа того:
C++
1
BASE* base = new CHILD();
по этому, если её не объявлять в базовом классе, то через указатель на базовый класс, динамический приведённый как бы к дочке, я никак не вызову эту функцию, т.к. в базовом её просто нет и о ней ничё не известно

Цитата Сообщение от Герц Посмотреть сообщение
virtual void Do() = 0;
Ну я ж говорю, что так можно делать, если у тебя чисто абстрактный класс, а у меня там есть не виртуальные метода и потом мне нужно создавать объект базового класса, а абстрактного класса объект нельзя создать.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
27.06.2013, 18:05     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #6
@FarStar,
как это не сможет... всё создаётся
http://codepad.org/ZWUCZqM3

тут почитать надо просто про Virtual Function Table
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2013, 18:10     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #7
Цитата Сообщение от FarStar Посмотреть сообщение
Как избежать не нужной пустой реализации виртуальных методов в базовом классе?
Мне кажется, что если нужно использовать динамическое связывание и не делать базовый класс абстрактным, то никак.

Добавлено через 4 минуты
Цитата Сообщение от abit Посмотреть сообщение
@FarStar,
как это не сможет... всё создаётся
http://codepad.org/ZWUCZqM3

тут почитать надо просто про Virtual Function Table
ТС нужно, чтобы и вот это работало:
C++
1
BASE* base = new BASE();
И вот это:
C++
1
BASE* base = new CHILD();
И чтобы через base можно было вызывать функцию Do() производного класса.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11819 / 6798 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
27.06.2013, 18:13     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #8
А, собственно, в чем идея? Лень писать скобки, или же пытаетесь экономить место в файле?
razor_ua
10 / 10 / 0
Регистрация: 20.05.2011
Сообщений: 71
27.06.2013, 18:13     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #9
зачем этого избегать? так и задумано:
в базовом классе ты определяешь вирт. метод (если сделать его чисто вирт. методом virtual void f() = 0, то его нужно будет обязательно переопределить во всех наследниках)
а если ты его реализуешь в базовом, то если в наследника нет его переопределения, то вызовется базовый.
FarStar
Заблокирован
27.06.2013, 18:31  [ТС]     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #10
поставил всем по плюсу

Да просто жаль, что нет полуабстрактных классов, в которых были бы и чисто виртуальные функции и обычные виртуальные и ваще обычные и чтоб можно было бы объект создавать такой.... Руки связанны
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 18:43     Как избежать не нужной пустой реализации виртуальных методов в базовом классе?
Еще ссылки по теме:

C++ Перегрузить операцию сложения в базовом классе, который имеет два наследника
C++ В базовом классе вводится символьный массив, а в производном - проверка на максимальную длину строки
C++ Виртуальные функции, таблицы виртуальных методов, как они работают?

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11819 / 6798 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
27.06.2013, 18:43     Как избежать не нужной пустой реализации виртуальных методов в базовом классе? #11
Да уж... бедный линкер бы повесился от такого беспредела
Yandex
Объявления
27.06.2013, 18:43     Как избежать не нужной пустой реализации виртуальных методов в базовом классе?
Ответ Создать тему
Опции темы

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