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

Указатели на классы - C++

Восстановить пароль Регистрация
 
rizr
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 71
11.09.2013, 16:34     Указатели на классы #1
C++
1
2
3
4
5
6
7
8
9
class A
{};
class B : public A
{};
 
int main()
{
A *ob1=new B;
B *ob2=new B;
хотелось бы узнать разницу между ob1 и ob2
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2013, 16:34     Указатели на классы
Посмотрите здесь:

Перечисление,указатели, классы C++
C++ Указатели на производные классы
Как можно решить? (классы, указатели) C++
Указатели на Классы C++
Классы, указатели и функции? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.09.2013, 16:37     Указатели на классы #2
ob1 - указатель на объект класса A. ob2 - указатель на объект класса B.
rizr
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 71
11.09.2013, 16:43  [ТС]     Указатели на классы #3
Цитата Сообщение от CheshireCat Посмотреть сообщение
ob1 - указатель на объект класса A. ob2 - указатель на объект класса B.
ну если ob1 указатель на А то почему он new B?
Убежденный
Системный программист
 Аватар для Убежденный
14193 / 6208 / 985
Регистрация: 02.05.2013
Сообщений: 10,343
Завершенные тесты: 1
11.09.2013, 16:43     Указатели на классы #4
ob1 - это указатель на подобъект A, являющийся частью объекта класса B.
ob2 - это указатель на объект класса B.
Так что оба указателя указывают на объект класса B, просто ob2 делает это "бесхитростно", а
ob1 - через указатель на A.
Пёс
 Аватар для Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
11.09.2013, 16:47     Указатели на классы #5
Если в классе B будут дополнительные поля, которых нет в классе А, то через указатель ob1 они будут недоступны.
rizr
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 71
11.09.2013, 16:52  [ТС]     Указатели на классы #6
Цитата Сообщение от Пёс Посмотреть сообщение
Если в классе B будут дополнительные поля, которых нет в классе А, то через указатель ob1 они будут недоступны.
а методы?

ну так гораздо понятней стало.
а тогда обратная схема допустима:
B *ob3 = new A ?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.09.2013, 17:01     Указатели на классы #7
Нет. Преобразование "указатель на потомка => указатель на предка" (или "потомок => предок") выполняется компилятором автоматически - так как потомок одновременно "является" и предком, т.е. содержит все поля и методы предка, тут работает LSP. Наоборот - нельзя (предок ничего не "знает" о тех полях и методах, которые появились у потомка).
Убежденный
Системный программист
 Аватар для Убежденный
14193 / 6208 / 985
Регистрация: 02.05.2013
Сообщений: 10,343
Завершенные тесты: 1
11.09.2013, 17:06     Указатели на классы #8
Есть класс A.
И есть класс B, который унаследован от A.
Это значит, что B содержит в себе подобъект класса A.

Теперь с объектом класса B можно обращаться через указатель или
ссылку на класс A или B. В первом случае будут доступны только
поля, объявленные в классе A, во втором случае - также все остальные,
которые появились в классе B.

Если в A есть виртуальный метод, переопределенный в классе B, то при
вызова этого метода на объекте класса B через указатель или ссылку на
класс A, будет вызываться метод B, а не A. Это поддержка языком
такой вещи, как полиморфизм. То есть, за указателем на базовый класс A
можно "замаскировать" объекты других, унаследованных от него типов, и
работать с ними через единый интерфейс, задекларированный в классе A.
Пёс
 Аватар для Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
11.09.2013, 17:06     Указатели на классы #9
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
class A
{
   int field_A;
   void method_A()
   {
      //что-то там...
   }
};
 
class B : public A
{
   public: 
      int field_B;
      void method_B()
      {
         //что-то другое...
      }
};
 
int main()
{
   A *ob1=new B;
   B *ob2=new B;
   
   ob1->field_A = 1; //допустимо, обращаемся к полю, определённому в А, объекта класса B через указатель на А
   ob1->method_A(); //допустимо, обращаемся к методу, определённому в А, объекта класса B через указатель на А
   
   ob1->field_B = 1; //недопустимо, указатель на A ничего не знает о полях, определённых в B.
   ob1->method_B(); //недопустимо, указатель на A ничего не знает о методах, определённых в B. 
 
   ob2->field_A = 1; //допустимо, указатель на B знает о полях определённых в A.
   ob2->method_B(); //допустимо, указатель на B знает о методах определённых в А
   ob2->field_B = 1; //допустимо, указатель на B знает о полях определённых в своём классе.
   ob2->method_B(); //допустимо, указатель на B знает о методах определённых в своём классе.
   
   B* ob3 = new A; //НЕДОПУСТИМО, нельзя помещать объект родителя, в указатель на потомка.
}
rizr
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 71
11.09.2013, 17:27  [ТС]     Указатели на классы #10
а в чем соль тогда записи A* ob1=new B если можно писать просто A *ob1=new A ?
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
11.09.2013, 17:32     Указатели на классы #11
Цитата Сообщение от rizr Посмотреть сообщение
а в чем соль тогда записи A* ob1=new B если можно писать просто A *ob1=new A ?
в том что в A нет того что есть в B
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.09.2013, 17:35     Указатели на классы #12
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
#include <iostream>
using namespace std;
 
class A
{
public:
    virtual void func() { cout << "A::func()" << endl; };
};
 
class B: public A
{
public:
    void func() { cout << "B::func()" << endl; };
};
 
class C: public B
{
public:
    void func() { cout << "C::func()" << endl; };
};
 
int main(void)
{
    const int SIZE = 5;
 
    A* arr[SIZE];   // можно объявить массив указателей на базовый класс!
 
    // а запихать в него разные классы....
    arr[0] = new A;
    arr[1] = new B;
    arr[2] = new A;
    arr[3] = new C;
    arr[4] = new C;
 
    // и все отработает корректно!
    for(int i = 0; i < SIZE; ++i)
        arr[i]->func();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 17:42     Указатели на классы
Еще ссылки по теме:

Задача на классы и статические указатели C++
C++ Возвращение исходного массива (классы, указатели)
Ссылки. Указатели. Классы C++

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

Или воспользуйтесь поиском по форуму:
Пёс
 Аватар для Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
11.09.2013, 17:42     Указатели на классы #13
rizr, соль в том, что когда нужно обработать кучу объектов, имеющих сходные свойства, но тем не менее имеющие различные поля и методы (которые нам собственно и не нужны) можно передавать их все, в виде указателей и ссылок на их родительский класс.

Например, нам нужно написать функцию, которая что-нибудь делает с полем field_A:

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
class A
{
   int field_A;
   void method_A()
   {
      //что-то там...
   }
};
 
class B : public A
{
   public: 
      int field_B;
      void method_B()
      {
         //что-то другое...
      }
};
 
bool function_1(const A* ptr)
{
    return ptr->field_A > 0; //возвращает true, когда field_a переданного объекта положительное.
}
 
int main()
{
   A *ob1=new B;
   B *ob2=new B;
   function_1(ob1);
   function_1(ob2);
}
PROFIT: Нам не пришлось создавать 2 версии функции function_1, потому что она не обращается к специфическим полям и методам класса B.
Yandex
Объявления
11.09.2013, 17:42     Указатели на классы
Ответ Создать тему
Опции темы

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