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

Создание полиморфного объекта, зачем создавать указатель на объект базового класса? - C++

Восстановить пароль Регистрация
 
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
25.07.2014, 18:08     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #1
Зачем создавать указатель на объект базового класса:
C++
1
Base *A = new Derived
Если можно сделать так:
C++
1
Derived *A = new Derived
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2014, 18:08     Создание полиморфного объекта, зачем создавать указатель на объект базового класса?
Посмотрите здесь:

C++ Ошибка компиляции (преобразование объекта класса в объект другого класса)
Указатель на объект класса C++
C++ Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Присваивание объекта базового класса наследуемому C++
Как используя закрытое наследование использовать 2 объекта базового класса? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
25.07.2014, 18:19     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #2
kylroma, это называется слабая связность. Ну и инверсия зависимостей.

Хотя именно в таком виде это особого смысла не несет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 18:26     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #3
Цитата Сообщение от kylroma Посмотреть сообщение
Зачем создавать указатель на объект базового класса:
C++
1
Base *A = new Derived;
Если можно сделать так:
C++
1
Derived *A = new Derived;
Кто-то заставляет?
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
25.07.2014, 18:38  [ТС]     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #4
Во всех примерах про полиморфизм объект создаётся как в первом примере. Я пробовал играться с виртуальными функциями классов. Ничего не меняется, от того как я создаю объекты.
Но судя по разным статьям про полиморфизм, создавать полиморфные объекты нужно как в первом случае.
Вот цитата одной из статьи:
Для создания полиморфного объекта вам следует использовать указатель на объект базового класса.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 18:57     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #5
Цитата Сообщение от kylroma Посмотреть сообщение
Но судя по разным статьям про полиморфизм, создавать полиморфные объекты нужно как в первом случае.
Естественно. Если иначе, то как полиморфизм демонстрировать?
Цитата Сообщение от kylroma Посмотреть сообщение
Я пробовал играться с виртуальными функциями классов. Ничего не меняется, от того как я создаю объекты.
В каком смысле ничего?

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

Добавлено через 2 минуты
Это и есть полиморфизм. Чтобы его увидеть в работе, естественно, нужно создавать указатель базового класса, связанный, в одном случае, с объектом производного класса, в другом случае - с объектом базового.

Добавлено через 5 минут
Если же тип указателя и объекта, с которым он связан, совпадают, то какой тут может быть полиморфизм? Всё будет работать, как обычно, что с виртуальными методами, что без них.
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
25.07.2014, 18:58  [ТС]     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Если указатель базового класса связан с объектом производного, то, при использовании виртуальных методов, через этот указатель, будут вызываться методы производного класса. Если этот указатель связан с объектом базового, то, при использовании виртуальных методов, через этот указатель, будут вызываться методы базового класса.
Так а зачем вообще использовать указатель на базовый класс? Если можно сделать так:
Derived *A = new Derived
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
25.07.2014, 19:00     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #7
kylroma, что так создаете, что эдак, разницы особой нет. Вопрос в функциях, которые работают с этими объектами. Чем более общий тип они могут обрабатывать, тем больше от них проку.
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
25.07.2014, 19:01  [ТС]     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #8
Вот пример. Если уберу virtual от метода print(), то объекты b и bb реагируют одинаково.
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
35
36
#include <iostream>
 
using namespace std;
 
class A
{
protected:
    int n=10;
public:
    A(){cout << "Create A, n = " << n << endl;};
    void Show() {/*cout << "Show A\n";*/print();}
   virtual void print(){cout << "print A\n";}
   virtual ~A(){std::cout << "close A\n";};
};
 
class B: public A
{
public:
    B(){cout << "Create B, n = " << n << endl;};
    ~B(){std::cout << "close B\n";}
    void print(){cout << "print B\n";}
};
 
 
int main()
{
    A *b = new B;
    b->Show();
   delete b;
   cout << endl;
 
   B *bb = new B;
   bb->Show();
   delete bb;
    return 0;
}
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
25.07.2014, 19:10     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #9
Цитата Сообщение от kylroma Посмотреть сообщение
Так а зачем вообще использовать указатель на базовый класс?
До тех пор пока рассуждаешь в терминах А и Б ничего и не поймешь. Нужно задачу хотя бы приближенную к реальности рассмотреть. А и Б подходят тогда, когда один разбирающийся человек расказывает другому разбирающемуся человеку свою идею. А если ты новичок, то не нужны тебе никакие А и Б.
В общем посмотри вот тут, я пытался человеку объяснить на конкретном примере.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
25.07.2014, 19:10     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <vector>
 
class A
{
public:
    virtual int GetPay()
    {
        return 10;
    }
};
 
class B : public A
{
    int GetPay()
    {
        return 15;
    }
};
 
class C : public A
{
    int GetPay()
    {
        return 20;
    }
};
 
 
void Foo(std::vector<A*> arr)
{
    int sum = 0;
    for (A *a : arr)
    {
        sum += (*a).GetPay();
    }
    std::cout << "SUM = " << sum << std::endl;
}
 
int main() {
    A* a = new A();
    B* b = new B();
    C* c = new C();
 
    std::vector<A*> vector{ new A(), new B(), new C() };
 
    Foo(vector);
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 19:14     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #11
Цитата Сообщение от kylroma Посмотреть сообщение
Если уберу virtual от метода print(), то объекты b и bb реагируют одинаково.
...
Цитата Сообщение от alsav22 Посмотреть сообщение
Если же тип указателя и объекта, с которым он связан, совпадают, то какой тут может быть полиморфизм? Всё будет работать, как обычно, что с виртуальными методами, что без них.
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
25.07.2014, 19:20     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #12
Как говорилось в одной рекламе: "Зачем спрашивать "Зачем"? Если вы не собираетесь вызывать функции Derived, разницы по большому счёту никакой.

Во всех примерах про полиморфизм объект создаётся как в первом примере.
На то они и примеры. Очень многие профессора в университетах дальше книжек Лафоре не ушли, так что не принимайте близко к сердцу учебники.

А давайте такой вопрос. А если вы не знаете, какой тип вам конкретно вернут?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 19:23     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #13
Цитата Сообщение от kylroma Посмотреть сообщение
Так а зачем вообще использовать указатель на базовый класс? Если можно сделать так: Derived *A = new Derived
...
Цитата Сообщение от alsav22 Посмотреть сообщение
Кто-то заставляет?
Не нужно, не используйте.
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
25.07.2014, 19:25  [ТС]     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #14
общение от kylroma
Если уберу virtual от метода print(), то объекты b и bb реагируют одинаково.
...
Сообщение от alsav22
Если же тип указателя и объекта, с которым он связан, совпадают, то какой тут может быть полиморфизм? Всё будет работать, как обычно, что с виртуальными методами, что без них.
с виртуальными методами тоже одинаково реагирует.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
25.07.2014, 19:26     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #15
kylroma, в общем, не используйте объекты базового типа Когда петух клюнет - тогда поймете, что к чему. А до тех пор можно не париться Это как с паттернами, пока они не пригодятся - толку от их зазубривания никакого.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 19:27     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #16
Цитата Сообщение от kylroma Посмотреть сообщение
с виртуальными методами тоже одинаково реагирует.
Я что-то обратное написал?
Цитата Сообщение от kylroma Посмотреть сообщение
Сообщение от alsav22
Если же тип указателя и объекта, с которым он связан, совпадают, то какой тут может быть полиморфизм? Всё будет работать, как обычно, что с виртуальными методами, что без них.
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
25.07.2014, 19:33  [ТС]     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #17
alsav22, так а я сам не знаю, когда нужно, а когда нет.

Добавлено через 5 минут
Psilon, мне для собеседования. Ну и для себя, конечно.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 19:33     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #18
Цитата Сообщение от kylroma Посмотреть сообщение
alsav22, так а я сам не знаю, когда нужно, а когда нет.
Когда нужно будет - тогда и узнаете. Почему в примерах по полиморфизму так пишут, надеюсь, поняли.
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
25.07.2014, 19:35  [ТС]     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #19
alsav22, значит в обоих случаях создаётся полиморфный объект? Я правильно понял?
C++
1
2
3
4
    Base *A = new Derived
 
 
    Derived *B = new Derived
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 19:39     Создание полиморфного объекта, зачем создавать указатель на объект базового класса?
Еще ссылки по теме:

Не создается указатель из-за базового класса с конструктором C++
Указатель на объект базового класса и адрес объекта производного класса C++
Создание базового класса и наследника C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 19:39     Создание полиморфного объекта, зачем создавать указатель на объект базового класса? #20
Цитата Сообщение от kylroma Посмотреть сообщение
значит в обоих случаях создаётся полиморфный объект? Я правильно понял?
...
Цитата Сообщение от alsav22 Посмотреть сообщение
Если же тип указателя и объекта, с которым он связан, совпадают, то какой тут может быть полиморфизм? Всё будет работать, как обычно, что с виртуальными методами, что без них.
Yandex
Объявления
25.07.2014, 19:39     Создание полиморфного объекта, зачем создавать указатель на объект базового класса?
Ответ Создать тему
Опции темы

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