Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
FarStar
Заблокирован
#1

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

27.06.2013, 17:24. Просмотров 616. Ответов 10
Метки нет (Все метки)

Для наглядности:
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();
};
ну собственно вопрос в том, как избежать этой реализации? Можно сделать чисто виртуальной, но у меня в базовом классе есть и не виртуальные методы и мне нужен объект базового класса - так что не прокатит.... помогите нубасу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2013, 17:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как избежать не нужной пустой реализации виртуальных методов в базовом классе? (C++):

Как работают static-переменные объявленные в в базовом классе? - C++
Информации увидел много, но суть так и не могу уловить. Образовалась пара вопросов: 1. Если я создаю static-переменную в классе и делаю...

Как определить тип объекта из таблицы виртуальных методов? - C++
Как можно определить тип объекта из таблицы виртуальных методов? Необходимо сравнить типы, не используя typeid, а также dynamic_cast.

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

Указатель на потомка в базовом классе. - C++
Мне нужно создать в базовом классе массив указателей на потомки этого класса. Помогите - как это сделать?

Почему без пустого целочисленного поля в базовом классе программа виснет? - C++
Итак, имеет три маленьких файлика: //expclasses10l.h class CLB { public: int erunda; CLB(); ...

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

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

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

тут почитать надо просто про Virtual Function Table
1
alsav22
5426 / 4821 / 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() производного класса.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 18:13 #8
А, собственно, в чем идея? Лень писать скобки, или же пытаетесь экономить место в файле?
1
razor_ua
10 / 10 / 0
Регистрация: 20.05.2011
Сообщений: 71
27.06.2013, 18:13 #9
зачем этого избегать? так и задумано:
в базовом классе ты определяешь вирт. метод (если сделать его чисто вирт. методом virtual void f() = 0, то его нужно будет обязательно переопределить во всех наследниках)
а если ты его реализуешь в базовом, то если в наследника нет его переопределения, то вызовется базовый.
1
FarStar
Заблокирован
27.06.2013, 18:31  [ТС] #10
поставил всем по плюсу

Да просто жаль, что нет полуабстрактных классов, в которых были бы и чисто виртуальные функции и обычные виртуальные и ваще обычные и чтоб можно было бы объект создавать такой.... Руки связанны
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
27.06.2013, 18:43 #11
Да уж... бедный линкер бы повесился от такого беспредела
0
27.06.2013, 18:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 18:43
Привет! Вот еще темы с ответами:

В базовом классе вводится символьный массив, а в производном - проверка на максимальную длину строки - C++
Здравствуйте. Помогите найти ошибку при наследовании класса. Есть такая проблема - в базовом классе вводится символьный массив, а в...

Создать массив в базовом абстрактном классе, и его передать функциям производных классов - C++
есть полностью абстрактный (виртуальный) класс. там все функции виртуальные и равны 0. Назовем его class A есть 3 производных ОТ НЕГО...

Назначение виртуальных методов класса - C++
Что-то никак не могу разобраться с виртуальными методами классов. В учебниках пишут, что они нужны при наследовании для определения одной и...

Реализация чистых виртуальных методов в производных классах - C++
Здравствуйте! Интересует такой вопрос: Допустим, имеется у нас базовый абстрактный класс и несколько производных от него классов. В...


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

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

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