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

Неочевидные грабли полиморфизма с++ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Таймер в програме http://www.cyberforum.ru/cpp-beginners/thread389684.html
Как сделать такой таймер: Нужно, чтобы значение переменной некоторого объекта увеличивалось через определенный интервал времени. При этом чтобы можно было вводить значения с клавиатуры. Просто чтобы объект сам модифицировался где-то на заднем плане. Без потоков можно как-то. winApi???? Добавлено через 52 минуты up up up
C++ Сортировка вставкой Всем привет. Задали задание написать код сортировки вставкой. Писал код по блок-схеме. Код получился нерабочий. Помогите найти ошибку. #include <stdio.h> #include <conio.h> int main() { int a; int n, i, j, x; printf ("Enter the number of elements "); scanf ("%d", &n); http://www.cyberforum.ru/cpp-beginners/thread389681.html
C++ Перегрузка операторов
Доброго времени суток. на завтра надо сделать работу, а я не могу понять как использовать перегрузку операторов. помогите пожалуйста разобраться вобщем надо найти количество значений переменных типа _Floors, _Flats, _Rooms.., вот код... // BSU012.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream>
Не могу объявить массив указателей на объект C++
Здравствуйте! Такой вопрос. При объявлении массива указателей на объект появляются 3 ошибки. void Cindex::merge(Ckey *A, int l, int m, int r) { int i, j; Ckey *Ax; for(i = m+1; i > l; i--) *Ax = *A; for(j = m; j < r; j++) *Ax = *A; for(int k(l); k <= r; k++) if(Ax->Getoffset() < Ax->Getoffset()) *A = *Ax; else
C++ рестарт http://www.cyberforum.ru/cpp-beginners/thread389674.html
как сделать автоматический рестарт программы после окончания ее работы? на примере
C++ Преобразование числа в символ. Здравствуйте, пишу программу перевода числа из Р-ичной системы счисления в Q-ичную. Столкнулся с такой вот проблемкой... При Q<10 все работает корректно, а вот при Q>10 вместо букв A,B,C,D.... выдаются цифры 10, 11, 12, 13.... соответственно, что само по себе естественно. Хочу сделать так: если остаток при целочисленном делении равен 10, 11, 12.... , то вместо цифр выдать на печать (или поместить... подробнее

Показать сообщение отдельно
Bers
Заблокирован
24.11.2011, 12:41  [ТС]     Неочевидные грабли полиморфизма с++
Пример наглядно иллюстрирует, что к одному и тому же объекту можно обращаться, и вызывать его методы. И при этом компилятор будит считать что этот объект - каждый раз разный.

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
struct First
{
    First(): a(333){}
    First( const First& istok) { std::cout << "Copy First\n"; }
    void View()
    {
        std::cout << "First\n"; 
        std::cout << "Size= "<< sizeof(*this)<< std::endl;
    }
    int a;
};
 
struct Second
{
    Second(): b(444){}
    Second( const Second& istok) { std::cout << "Copy Second\n"; }
    void View()
    {
        std::cout << "Second\n"; 
        std::cout << "Size= "<< sizeof(*this)<< std::endl;
    }
    int b;
};
 
 
struct Test: public First, public Second 
{
    void View()
    {
        std::cout << "Test\n"; 
        std::cout << "Size= "<< sizeof(*this)<< std::endl;
    }
};
 
int main()
{
    Test t; //доступны a, b 
    Test* ptr= &t;
    ptr->View();
 
    First* pFirst= static_cast<First*>(ptr);
    pFirst->View(); //сейчас объекту не доступен b
 
    //компилятор реально думает, что имеет дело с объектом First
    //а не Test
    std::cout<< "SIZE = " << sizeof( *pFirst ) <<std::endl;
 
    (static_cast<Second*>(ptr))->View(); //сейчас объекту не доступен a
    
    return 0;
};
Таким образом, работая с объектом через указатель, можно интерпритировать тип объекта как угодно. Что в случае с полиморфизмом может приводить к забавным последствиям.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru