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

Тонкость с указателями - взятие указателя на базовый класс - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ map<string, string>define_map http://www.cyberforum.ru/cpp-beginners/thread730677.html
нужно имитировать работу препроцессора #define у нас есть файл из которого считали программу на С++. list<string> word_list; list<string>::iterator i; string str; //заполняю word_list while(1){ getline(in,str); word_list.push_back(str);
C++ не работает функция-счётчик Функция должна возвращать целое значение, уменьшающееся на 1 при каждом вызове. Начальное значение равно 10 #include "stdafx.h" int main() { static int a=10; a--; printf("%d \n",a); return a; } http://www.cyberforum.ru/cpp-beginners/thread730676.html
Минимальное дерево-остов C++
Ребят, помогите пожалуйста решить задачу в BC++ )) На плоскости своими координатами заданно n точек. Построить связный граф с вершинами во всех этих точках так, чтобы суммарная длина его ребер была наименьшей.
C++ как переделать программу?
компилятор выдает много ошибок, как исправить ума не приложу. может быть что то нужно переделать? подскажите #include <stdlib.h> #include <conio.h> #include <math.h> void main() { double s, n, m, b, a, c, x, y, nm; cout <<"Vvedi a "; cin >> a;
C++ буквенная матрица в С++ http://www.cyberforum.ru/cpp-beginners/thread730634.html
помогите пожалуйста не могу сделать нужно создать буквенную матрицу при нажатии любой клавиши где i=j выводит букву О,i>j выводит-N,i<j выводит -Z, и при нажатии другой значения инвертируются : i>j выводит Z,i<j выводит -N. сделала но почему то не выводит букву О, и так же надо перевести формат cpp в exe? листинг: # include <iostream.h> # include <windows.h> # include <conio.h> #...
C++ Двумерный массив с указателем (Преобразовать матрицу по правилу) Здравствуйте. Помогите пожалуйста. Задание: Дана действительная квадратная матрица порядка n. Преобразовать матрицу по правилу: строку с номером n сделать столбцом с номером n, а столбец с номером n сделать строкой с номером n. подробнее

Показать сообщение отдельно
ZiminAS1990
 Аватар для ZiminAS1990
2 / 2 / 0
Регистрация: 27.07.2012
Сообщений: 31
13.12.2012, 19:53     Тонкость с указателями - взятие указателя на базовый класс
Как-то возник в голове вопрос:
пусть класс D наследует классы A и B. Если у меня есть объект D, я беру его адрес и типизирую его к базовым классам A и B. Получаю два указателя типа A* и B*. Будут ли они указывать на корректные объекты?

Я всегда предполагал, что конструкции типа:
Type1 *a = (Type1*)b;
это указания компилятору интерпретировать данные по указателю b как данные типа Type1. А значит, указатель "a" всегда должен указывать на ту же ячейку памяти что и указатель b.
Если так, то указатели A* и B* должны будут указывать на одну и ту же ячейку памяти, что приведёт к ошибке (это ведь должно быть два разных объекта!)

Решил проверить. Написал простую программу:
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
class A {
public:
A() : a(10), b(20) {}
double a;
double b;
};
 
class B {
public:
B() : c(30), d(40) {}
double c;
double d;
};
 
class D : public A, public B {
public:
D() : e(50), j(60) {}
double e;
double j;
};
 
int main()
{
D objD;
// Получим базовые классы от производного:
A *objA = (A*)&objD;
B *objB = (B*)&objD;
// Получим производный класс от базового:
D* objDFromA = (D*)objA;
D* objDFromB = (D*)objB;
objD.a = 100;
objD.c = 300;
return 0;
}
Получилось так, что указатели objA и objB указывают на РАЗНЫЕ ячейки памяти, не смотря на то, что они получены простой типизацией одного и того же указателя objD.
Как реализован этот механизм? Получается, что вычисление значений указателей objA и objB производится в процессе выполнения программы (для этого генерируются отдельные инструкции в исполняемом файле)?
Это стандартный трюк и его можно безбоязненно использовать? Или не все компиляторы это поддерживают? (я использовал g++)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 20:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru