Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 23
1

Переопределение виртуальной функции

15.05.2017, 00:36. Показов 1997. Ответов 12
Метки нет (Все метки)

Всем доброй ночи Есть базовый абстрактный класс и два производных класса (А и В), в которых я пытяюсь переопределить виртуальную функцию informing(). А еще нужно, чтобы производный класс определялся через параметр функции creator(), но что-то не работает ПОДСКАЖИТЕ, ПЛИИИИИИЗ, ЧТО Я ДЕЛАЮ НЕ ТАК? Чувствую, что дело в функции creator(), но вот что.... Я ж ей на вход передаю 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
29
30
31
32
33
34
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
 
class BaseClass {
    public: virtual string informing() { return "[BaseClass]"; }
};
 
class DerivedClass_A : public BaseClass {
    public: virtual string informing() override { return "[Class_A]"; }
};
 
class DerivedClass_B : public BaseClass {
    public: virtual string informing() override { return "[Class_B]"; }
};
 
BaseClass * creator(int i)
{
    switch (i)
    {
        case 1:  return new DerivedClass_A; break;
        default: return new DerivedClass_B; break;
    }
 
}
 
int main()
{
    BaseClass x = * creator(1);
    cout << x.informing() << endl;
    system("pause");
    return 0;
}
0

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

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2017, 00:36
Ответы с готовыми решениями:

Наследование. Переопределение виртуальной функции
Здравствуйте. Нужно создать классы, наследование. Переопределить для каждого класса виртуальную...

Переопределение виртуальной функции в производном классе
Здравствуйте, я столкнулся с проблемой при переопределения виртуальной функции в производном...

Переопределение публичной виртуальной функции как private
struct Foo { public: virtual void show() { std::cout &lt;&lt; &quot;Foo&quot; &lt;&lt; std::endl; } }; ...

Переопределение виртуальной функции в разных файлах наследственных классов
Всем привет ! У меня есть проблема, допустим есть класс Base.h и соответственно он имеет Base.cpp в...

12
nd2
3411 / 2791 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
15.05.2017, 02:45 2
Лучший ответ Сообщение было отмечено ajhev как решение

Решение

Цитата Сообщение от ajhev Посмотреть сообщение
ЧТО Я ДЕЛАЮ НЕ ТАК?
C++
1
2
   BaseClass* x = creator(1);
   cout << x ->informing() << endl;
1
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 23
15.05.2017, 15:30  [ТС] 3
Спасибо!
Подскажите, а где лучше всего почитать, чтобы хорошо разобраться с понятием ссылки (*) и отличием "->" от "."? Хотелось бы разобраться в деталях, чем отличается "BaseClass x = * creator(1)" от "BaseClass* x = creator(1)".
0
Форумчанин
Эксперт CЭксперт С++
8165 / 5013 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
15.05.2017, 15:40 4
Цитата Сообщение от ajhev Посмотреть сообщение
а где лучше всего почитать, чтобы хорошо разобраться
Книга - лучший друг человека.
0
nd2
3411 / 2791 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
15.05.2017, 15:42 5
Цитата Сообщение от ajhev Посмотреть сообщение
с понятием ссылки (*)
Это не ссылка, указатель. С ссылкой полиморфизм тоже бы работал:
C++
1
2
   BaseClass& x = *creator(1);
   cout << x.informing() << endl;
0
801 / 531 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
15.05.2017, 15:42 6
Цитата Сообщение от ajhev Посмотреть сообщение
где лучше всего почитать
ты считаешь, что это дело пяти минут, всего лишь прочесть пару страничек?

понимание возникает после перелопачивания толстенных книжек over 1000 страниц
0
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 23
15.05.2017, 17:22  [ТС] 7
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
ты считаешь, что это дело пяти минут, всего лишь прочесть пару страничек?
никто не говорил про 5 минут буду разбираться, пока не пойму...
0
667 / 213 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
15.05.2017, 17:38 8
Цитата Сообщение от ajhev Посмотреть сообщение
отличием "->" от "."
все просто
стрелка -> копается в куче
точка . роется в стеке
0
nd2
3411 / 2791 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
15.05.2017, 17:46 9
Цитата Сообщение от dailydose Посмотреть сообщение
все просто
стрелка -> копается в куче
точка . роется в стеке
Не связанные вещи.
0
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 23
15.05.2017, 17:51  [ТС] 10
Цитата Сообщение от dailydose Посмотреть сообщение
все просто
стрелка -> копается в куче
точка . роется в стеке
я пока не знаю про кучу, да и про стек слышал только теоретические вещи
0
667 / 213 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
15.05.2017, 18:41 11
Цитата Сообщение от nd2 Посмотреть сообщение
Не связанные вещи.
C++
1
2
classname obj;
obj.callmethod();// stack
C++
1
2
classname* ptr;
ptr->callmethod();// heap
/idk.

Добавлено через 15 секунд
Цитата Сообщение от nd2 Посмотреть сообщение
Не связанные вещи.
C++
1
2
classname obj;
obj.callmethod();// stack
C++
1
2
classname* ptr;
ptr->callmethod();// heap
/idk.
0
nd2
3411 / 2791 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
15.05.2017, 18:54 12
C++
1
2
3
4
5
6
7
8
   BaseClass obj;
   cout << (&obj) ->informing() << endl; // где здесь куча?
   BaseClass* p = &obj;
   cout << p ->informing() << endl; // где здесь куча?
   static BaseClass obj_st;
   cout << obj_st.informing() << endl; // где здесь стек?
   p = new BaseClass;
   cout << (*p).informing() << endl; // где здесь стек?
Добавлено через 2 минуты
Цитата Сообщение от dailydose Посмотреть сообщение
classname* ptr;
ptr->callmethod();// heap
Какой, нахрен, heep, если даже new не было?
1
667 / 213 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
15.05.2017, 19:29 13
Цитата Сообщение от nd2 Посмотреть сообщение
(&obj) ->informing() << endl; // где здесь куча?
взятие адреса - работа с адресами
Цитата Сообщение от nd2 Посмотреть сообщение
cout << (*p).informing() << endl; // где здесь стек?
здесь в стеке хранится адрес указателя на кучку

Добавлено через 1 минуту
Цитата Сообщение от nd2 Посмотреть сообщение
Какой, нахрен, heep, если даже new не было?
heep-hoop

Добавлено через 2 минуты

Не по теме:

ну а на самом деле
-> к указателю (колдовать можно и брать адрес)
. применятся к объекту (колдовать можно и разыменовывая указатель)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2017, 19:29

определение функции в ЗАГОЛОВОЧНОМ файле. В основном предполагается переопределение ТЕЛА этой функции. Как это сделать, не правя хидер?
Сабж, а подробнее если в заголовочном файле hider.h описана функция, допустим так: void f ();...

Переопределение функции по наследовинии
Помниться в с# есть такая штучка override,есть ли что-нибудь подобное в с++? Столкнулся с...

Переопределение функции в шаблоне
Подскажите, в пустом проекте работает следующий код #include &lt;utility&gt; #include &lt;type_traits&gt;...

Шаблоны и переопределение функции swap
Есть у меня шаблонный класс, решил для него функцию swap написать: template &lt;typename T&gt; void...


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

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

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