Форум программистов, компьютерный форум 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, 17:54  [ТС]     Неочевидные грабли полиморфизма с++
Итак. Я уже почти было убедился, что приведение типов вызывает конструктор копирования.

То есть, "привести тип A к типу B" фактически означает "создать временный объект типа B, при помощи конструктора копирования этого типа B, аргументом которого будит являться объект типа А".

То бишь, временный объект типа B будит создан при помощи копирующего конструктора по прототипу типа A.


На самом деле, для меня это было открытием. Я то думал, что приведение типов меняет лишь интерпретацию типа объекта, и никаких расходов на копирование не произойдёт!

Естественно, я обеспокоился, и начал обшаривать существующую архитектуру своего прожекта.
Поскольку я пихал приведение типов везде где только можно. Я ж не знал, что это может привести к падению производительности из-за запусков копирующих конструкторов.

Я решил, что если такие места есть, то можно избавиться от ненужного копирования за счёт приведение типов указателей, а не самих объектов.
То есть изменить интерпретацию типа объекта, за счет приведения указателя на нужный тип, и подсовывание указателя вместо объекта.

Я почти не сомневался в том, что предстоит довольно кропотливая работа по чистке всего кода, и спасению производительности (так то оно конечно не тормозит. Так что можно было и не заострятся. Но я ж не зря свой скилл прокачиваю. Надо использовать полученное знание).

И я был поражон....

Объясните мне, почему так?

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
struct Base
{
    Base():a(333){}
    Base(const Base& istok): a(istok.a){ std::cout<< "Copy\n"; }
    void Print(const Base& istok )  {    std::cout<< "Print: a="<<istok.a<<std::endl;  }
    int a;
};
 
struct Derrived: public Base
{
    void Print(const Derrived& istok ) 
    { 
        std::cout<< "Derrived Print\n";
        Base::Print( istok ); //здесь происходит приведение типа
                              //от потомка к базовому
                              //почему при этом не срабатывает 
                              //копирующий конструктор?
    }
};
 
 
 
int main()
{
    Derrived test;
    test.Print(test);
    return 0;
};
Что я не так понимаю? Методу Print Derrived скармливается объект типа Derrived
А он в свою очередь проталкивает этот объект своему базовому классу.

Но базовый класс в качестве аргумента принимает только объекты своего класса!
Таким образом в момент передачи типа Derrived методу класса Base должно произойти приведение типа!

И соответственно, должен быть вызван копирующий конструктор. Почему этого не произошло?
Неужели сменилась просто интерпретация типа?
 
Текущее время: 01:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru