21.11.2013 Funny CPP
Материал из SRNS
Boldenkov (обсуждение | вклад) |
Korogodin (обсуждение | вклад) |
||
(не показаны 4 промежуточные версии 1 участника) | |||
Строка 1: | Строка 1: | ||
<summary [ hidden ]> | <summary [ hidden ]> | ||
Немного поигрались с наследованием и полиморфизмом | Немного поигрались с наследованием и полиморфизмом | ||
− | + | [[file:20131127 CppMagic.png|link=Blog:Boldenkov/21.11.2013 Funny CPP|400px]] | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</summary> | </summary> | ||
Строка 64: | Строка 60: | ||
TimeScale timeScale; | TimeScale timeScale; | ||
TimeScale *timeScaleP; | TimeScale *timeScaleP; | ||
− | + | ||
− | + | ||
timeScaleRcv.E = 0xE; // Дополнительные данные | timeScaleRcv.E = 0xE; // Дополнительные данные | ||
timeScaleRcv.F = 0xF; | timeScaleRcv.F = 0xF; | ||
Строка 117: | Строка 112: | ||
Результат выполнения: | Результат выполнения: | ||
<source lang="bash"> | <source lang="bash"> | ||
− | eugene@object-d /tmp/ | + | eugene@object-d /tmp/WowCPP $ ./test |
Constructor | Constructor | ||
Constructor | Constructor | ||
Строка 161: | Строка 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]);
}
}
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
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
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
Вывод - можно передавать указатель на объект, как на обычную структуру из С, там будут только данные, и никаких указателей на методы или чего-то в этом роде. Причём полиморфизм в этом случае позволяет правильно преобразовать типы и получить правильный указатель.
[ Хронологический вид ]Комментарии
Войдите, чтобы комментировать.