21.11.2013 Funny CPP

Материал из SRNS
Перейти к: навигация, поиск
 
(не показаны 6 промежуточных версий 1 участника)
Строка 1: Строка 1:
 
<summary [ hidden ]>
 
<summary [ hidden ]>
 
Немного поигрались с наследованием и полиморфизмом
 
Немного поигрались с наследованием и полиморфизмом
 +
[[file:20131127 CppMagic.png|link=Blog:Boldenkov/21.11.2013 Funny CPP|400px]]
 +
 
</summary>
 
</summary>
  
Строка 58: Строка 60:
 
   TimeScale  timeScale;       
 
   TimeScale  timeScale;       
 
   TimeScale *timeScaleP;       
 
   TimeScale *timeScaleP;       
 
+
   
 
+
 
   timeScaleRcv.E = 0xE;      // Дополнительные данные
 
   timeScaleRcv.E = 0xE;      // Дополнительные данные
 
   timeScaleRcv.F = 0xF;
 
   timeScaleRcv.F = 0xF;
Строка 71: Строка 72:
 
   add        = timeScaleRcv;  // Копируется E
 
   add        = timeScaleRcv;  // Копируется E
  
   timeScaleP = &timeScaleRcv; // Передаётся указатель на E
+
   timeScaleP = &timeScaleRcv; // Передаётся указатель на A
 
   addP      = &timeScaleRcv; // Передаётся указатель на E
 
   addP      = &timeScaleRcv; // Передаётся указатель на E
 
   addP2      = (Tadd*)((int*)(&timeScaleRcv)); // Передаётся указатель на A
 
   addP2      = (Tadd*)((int*)(&timeScaleRcv)); // Передаётся указатель на A
Строка 111: Строка 112:
 
Результат выполнения:
 
Результат выполнения:
 
<source lang="bash">
 
<source lang="bash">
eugene@object-d /tmp/WhowCPP $ ./test  
+
eugene@object-d /tmp/WowCPP $ ./test  
 
Constructor
 
Constructor
 
Constructor
 
Constructor
Строка 155: Строка 156:
 
</source>
 
</source>
  
Вывод - можно передавать указатель на объект, как на обычную структуру из С, там будут только данные, и никаких указателей на методы или чего-то в этом роде. Причём полиморфизм в этом случае позволяет правильно преобразовать типы.
+
Вывод - можно передавать указатель на объект, как на обычную структуру из С, там будут только данные, и никаких указателей на методы или чего-то в этом роде. Причём полиморфизм в этом случае позволяет правильно преобразовать типы и получить правильный указатель.
  
 
{{wl-publish: 2013-11-27 15:39:30 +0400 | Boldenkov }}
 
{{wl-publish: 2013-11-27 15:39:30 +0400 | Boldenkov }}

Текущая версия на 08:29, 21 декабря 2013

Немного поигрались с наследованием в С++.

Зацените:

#include <stdio.h>

class TimeScale {
public:
  int A;
  int B;
  int C;
  int D;
  int func(int p);
  TimeScale();
};

class Tadd {
public:
  int E;
};

class TimeScaleRcv : public TimeScale, public Tadd {
public:
  int F;
};

int TimeScale::func(int p) {
  static int internal_data;
  internal_data = 0xCC;

  printf("%d %d\n", A, p);
}

TimeScale::TimeScale() {
  printf("Constructor\n");
}


int main(void) {
  // Создание объекта
  TimeScaleRcv timeScaleRcv;
  timeScaleRcv.A = 0xA;
  timeScaleRcv.B = 0xB;
  timeScaleRcv.C = 0xC;

  // Копирование объекта
  TimeScaleRcv  timeScaleRcvCopy;
  TimeScaleRcv *timeScaleRcvCopyP;

  timeScaleRcvCopy  =  timeScaleRcv;
  timeScaleRcvCopyP = &timeScaleRcv;

  // Объект TimeScale
  TimeScale  timeScale;      
  TimeScale *timeScaleP;      
   
  timeScaleRcv.E = 0xE;       // Дополнительные данные
  timeScaleRcv.F = 0xF;

  // Объект Tadd
  Tadd add;                  
  Tadd *addP, *addP2;

  // It's magic!!!
  timeScale  = timeScaleRcv;  // Копируются ABCD
  add        = timeScaleRcv;  // Копируется E

  timeScaleP = &timeScaleRcv; // Передаётся указатель на A
  addP       = &timeScaleRcv; // Передаётся указатель на E
  addP2      = (Tadd*)((int*)(&timeScaleRcv)); // Передаётся указатель на A

  // Дампы
  int i;

  printf("Объекты типа TimeScaleRcv:\n");
  printf("  Оригинал Копия    Указатель\n");
  for (i=0; i<10; i++) {
    printf("%d %08X %08X %08X\n", i, ((int*)(&timeScaleRcv))[i], ((int*)(&timeScaleRcvCopy))[i], ((int*)(timeScaleRcvCopyP))[i]);
  }
 
  printf("\n");
  printf("Объекты типа TimeScale:\n");
  printf("  Оригинал Копия    Указатель\n");
  for (i=0; i<10; i++) {
    printf("%d %08X %08X %08X\n", i, ((int*)(&timeScaleRcv))[i], ((int*)(&timeScale))[i], ((int*)(timeScaleP))[i]);
  }


  printf("\n");
  printf("Объекты типа Tadd:\n");
  printf("  Копия    Указатель Обман_C++\n");
  for (i=0; i<10; i++) {
    printf("%d %08X %08X %08X\n", i, ((int*)(&add))[i], ((int*)(addP))[i], ((int*)(addP2))[i]);
  }

}

Makefile для компиляции:

all:
        g++ test.cpp -o test

Результат выполнения:

eugene@object-d /tmp/WowCPP $ ./test
Constructor
Constructor
Constructor
Объекты типа TimeScaleRcv:
  Оригинал Копия    Указатель
0 0000000A 0000000A 0000000A
1 0000000B 0000000B 0000000B
2 0000000C 0000000C 0000000C
3 00000000 00000000 00000000
4 0000000E 6ED82078 0000000E
5 0000000F 00007F6E 0000000F
6 0A208AD0 00400641 0A208AD0
7 00007FFF 00000000 00007FFF
8 0A208AE0 0000000A 0A208AE0
9 00007FFF 0000000B 00007FFF

Объекты типа TimeScale:
  Оригинал Копия    Указатель
0 0000000A 0000000A 0000000A
1 0000000B 0000000B 0000000B
2 0000000C 0000000C 0000000C
3 00000000 00000000 00000000
4 0000000E 0000000A 0000000E
5 0000000F 0000000B 0000000F
6 0A208AD0 0000000C 0A208AD0
7 00007FFF 00000000 00007FFF
8 0A208AE0 6ED82078 0A208AE0
9 00007FFF 00007F6E 00007FFF

Объекты типа Tadd:
  Копия    Указатель Обман_C++
0 0000000E 0000000E 0000000A
1 00007F6E 0000000F 0000000B
2 6F925202 0A208AD0 0000000C
3 00007F6E 00007FFF 00000000
4 0000000A 0A208AE0 0000000E
5 0000000B 00007FFF 0000000F
6 0000000C 0A208AD0 0A208AD0
7 00000000 00007FFF 00007FFF
8 0000000A 0A208AD0 0A208AE0
9 0000000B 00007FFF 00007FFF

Вывод - можно передавать указатель на объект, как на обычную структуру из С, там будут только данные, и никаких указателей на методы или чего-то в этом роде. Причём полиморфизм в этом случае позволяет правильно преобразовать типы и получить правильный указатель.


[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.

Персональные инструменты
Пространства имён

Варианты
Действия
SRNS Wiki
Рабочие журналы
Приватный файлсервер
QNAP Сервер
Инструменты