21.11.2013 Funny CPP
Материал из SRNS
Boldenkov (обсуждение | вклад) |
Boldenkov (обсуждение | вклад) |
||
Строка 71: | Строка 71: | ||
add = timeScaleRcv; // Копируется E | add = timeScaleRcv; // Копируется E | ||
− | timeScaleP = &timeScaleRcv; // Передаётся указатель на | + | timeScaleP = &timeScaleRcv; // Передаётся указатель на E |
addP = &timeScaleRcv; // Передаётся указатель на E | addP = &timeScaleRcv; // Передаётся указатель на E | ||
− | addP2 = (Tadd*)((int*)(&timeScaleRcv)); // Передаётся указатель на | + | addP2 = (Tadd*)((int*)(&timeScaleRcv)); // Передаётся указатель на A |
// Дампы | // Дампы |
Версия 15:42, 27 ноября 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; // Передаётся указатель на E
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]);
}
}
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; // Передаётся указатель на E
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
g++ test.cpp -o test
Результат выполнения:
eugene@object-d /tmp/WhowCPP $ ./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
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
Вывод - можно передавать указатель на объект, как на обычную структуру из С, там будут только данные, и никаких указателей на методы или чего-то в этом роде. Причём полиморфизм в этом случае позволяет правильно преобразовать типы.
[ Хронологический вид ]Комментарии
Войдите, чтобы комментировать.