Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
1

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

25.07.2014, 18:08. Показов 5822. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Зачем создавать указатель на объект базового класса:
C++
1
Base *A = new Derived
Если можно сделать так:
C++
1
Derived *A = new Derived
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2014, 18:08
Ответы с готовыми решениями:

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; }...

Указатель на объект базового класса
Есть класс Автор с полями фамилия, год рождения и пол и есть второй класс Книга с полями название,...

Указатель на объект базового класса
Добрый вечер, форумчане. Имеется функция, которая находит в бинарном дереве(сортируемом по id)...

Возможно ли указатель производного класса инициализировать объектом базового класса?
имеется связка наследуемых классов A->B а от B наследуются одновременно еще два класса B->C и B->D...

19
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.07.2014, 18:19 2
kylroma, это называется слабая связность. Ну и инверсия зависимостей.

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

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

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

Добавлено через 5 минут
Если же тип указателя и объекта, с которым он связан, совпадают, то какой тут может быть полиморфизм? Всё будет работать, как обычно, что с виртуальными методами, что без них.
1
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
25.07.2014, 18:58  [ТС] 6
Цитата Сообщение от alsav22 Посмотреть сообщение
Если указатель базового класса связан с объектом производного, то, при использовании виртуальных методов, через этот указатель, будут вызываться методы производного класса. Если этот указатель связан с объектом базового, то, при использовании виртуальных методов, через этот указатель, будут вызываться методы базового класса.
Так а зачем вообще использовать указатель на базовый класс? Если можно сделать так:
Derived *A = new Derived
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.07.2014, 19:00 7
kylroma, что так создаете, что эдак, разницы особой нет. Вопрос в функциях, которые работают с этими объектами. Чем более общий тип они могут обрабатывать, тем больше от них проку.
0
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
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;
}
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
25.07.2014, 19:10 9
Цитата Сообщение от kylroma Посмотреть сообщение
Так а зачем вообще использовать указатель на базовый класс?
До тех пор пока рассуждаешь в терминах А и Б ничего и не поймешь. Нужно задачу хотя бы приближенную к реальности рассмотреть. А и Б подходят тогда, когда один разбирающийся человек расказывает другому разбирающемуся человеку свою идею. А если ты новичок, то не нужны тебе никакие А и Б.
В общем посмотри вот тут, я пытался человеку объяснить на конкретном примере.
2
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
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;
}
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 19:14 11
Цитата Сообщение от kylroma Посмотреть сообщение
Если уберу virtual от метода print(), то объекты b и bb реагируют одинаково.
...
Цитата Сообщение от alsav22 Посмотреть сообщение
Если же тип указателя и объекта, с которым он связан, совпадают, то какой тут может быть полиморфизм? Всё будет работать, как обычно, что с виртуальными методами, что без них.
0
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
25.07.2014, 19:20 12
Как говорилось в одной рекламе: "Зачем спрашивать "Зачем"? Если вы не собираетесь вызывать функции Derived, разницы по большому счёту никакой.

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

А давайте такой вопрос. А если вы не знаете, какой тип вам конкретно вернут?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 19:23 13
Цитата Сообщение от kylroma Посмотреть сообщение
Так а зачем вообще использовать указатель на базовый класс? Если можно сделать так: Derived *A = new Derived
...
Цитата Сообщение от alsav22 Посмотреть сообщение
Кто-то заставляет?
Не нужно, не используйте.
0
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
25.07.2014, 19:25  [ТС] 14
общение от kylroma
Если уберу virtual от метода print(), то объекты b и bb реагируют одинаково.
...
Сообщение от alsav22
Если же тип указателя и объекта, с которым он связан, совпадают, то какой тут может быть полиморфизм? Всё будет работать, как обычно, что с виртуальными методами, что без них.
с виртуальными методами тоже одинаково реагирует.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.07.2014, 19:26 15
kylroma, в общем, не используйте объекты базового типа Когда петух клюнет - тогда поймете, что к чему. А до тех пор можно не париться Это как с паттернами, пока они не пригодятся - толку от их зазубривания никакого.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 19:27 16
Цитата Сообщение от kylroma Посмотреть сообщение
с виртуальными методами тоже одинаково реагирует.
Я что-то обратное написал?
Цитата Сообщение от kylroma Посмотреть сообщение
Сообщение от alsav22
Если же тип указателя и объекта, с которым он связан, совпадают, то какой тут может быть полиморфизм? Всё будет работать, как обычно, что с виртуальными методами, что без них.
0
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
25.07.2014, 19:33  [ТС] 17
alsav22, так а я сам не знаю, когда нужно, а когда нет.

Добавлено через 5 минут
Psilon, мне для собеседования. Ну и для себя, конечно.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 19:33 18
Цитата Сообщение от kylroma Посмотреть сообщение
alsav22, так а я сам не знаю, когда нужно, а когда нет.
Когда нужно будет - тогда и узнаете. Почему в примерах по полиморфизму так пишут, надеюсь, поняли.
0
Одессит
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
25.07.2014, 19:35  [ТС] 19
alsav22, значит в обоих случаях создаётся полиморфный объект? Я правильно понял?
C++
1
2
3
4
    Base *A = new Derived
 
 
    Derived *B = new Derived
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 19:39 20
Цитата Сообщение от kylroma Посмотреть сообщение
значит в обоих случаях создаётся полиморфный объект? Я правильно понял?
...
Цитата Сообщение от alsav22 Посмотреть сообщение
Если же тип указателя и объекта, с которым он связан, совпадают, то какой тут может быть полиморфизм? Всё будет работать, как обычно, что с виртуальными методами, что без них.
0
25.07.2014, 19:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2014, 19:39
Помогаю со студенческими работами здесь

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса
Класс В является производным от класса А. Определить обработчик исключительной ситуации на...

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект...

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru