21.11.2013 Funny CPP

Материал из SRNS
Перейти к: навигация, поиск

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

Зацените:

#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 Сервер
Инструменты