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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sledge
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 13
#1

Вопросец о виртуальном конструкторе копировщике. - C++

05.08.2009, 21:43. Просмотров 716. Ответов 4
Метки нет (Все метки)

Здравствуйте, все.
Вопрос плана такого:
Читаю, значит, книжку. Дочитал до виртуальных методов. И дошел до главы с названием" Виртуальный конструктор-копировщик".
Цитата :
... Иногда требуется, чтобы программа могла передать указатель на объект базового класса и правильно скопировать его в объект производного класса.Чтобы этого добиться, необходимо создать виртуальный метод Clone()...

Теперь, значит вопрос или вопросы.
1. Передать - куда?
2. Передать указатель.... и скопировать его в объект... Может тут трудности перевода или у меня знаний не хватает - но не могу Въехать - скопировать указатель в объект, пожалуйста, пролейте свет, если можно - примером :-)

Заранее благодарен всем (читающим || отвечающим).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2009, 21:43     Вопросец о виртуальном конструкторе копировщике.
Посмотрите здесь:

Длина строки - вопросец. - C++
int le(char array) { int i; for(i=0;array != NULL;i++); return i; }

О виртуальном наследовании - C++
Хотелось бы с Вашей помощью разобраться в деталях виртуального наследования. Вопрос такой: что на физическом уровне означает выражение ...

Как перегрузить оператор в виртуальном классе - C++
Помогите пожалста разобраться с перегрузкой операторов в абстрактных классах!!!! Есть чисто виртуальный класс физических величин ...

Почему при виртуальном наследовании компилятор не знает о иерархии? - C++
Рассмотрим пример: class Base { virtual void foo()=0; }; class Derv :public Base { foo(){}

О конструкторе копирования - C++
Доброго времени суток всем присутствующим. Интересует маленький вопрос. В 15-й строке происходит прямое обращение к полю входного объекта...

Explicit в конструкторе - C++
Ключевое слово explicit перед конструктором служит лишь для того чтобы не запутаться и передавать аргумент в конструктор явно? Например: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
05.08.2009, 21:46     Вопросец о виртуальном конструкторе копировщике. #2
Копирующий конструктор выглядит так:
C++
1
2
3
4
5
6
7
class cl
{
cl(const cl &);
};
cl::cl(const cl&obj)
{
}
1. Передать - куда?
Передать при наследовании например.
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
06.08.2009, 17:53     Вопросец о виртуальном конструкторе копировщике. #3
Цитата Сообщение от Sekt Посмотреть сообщение
Копирующий конструктор выглядит так:
Это не то.


Клонирование нужно, чтоб получить в другом указателе копию обджекта.
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
class A
{
public:
   virtual A* Clone() = 0;
};
 
class B: public A
{
public:
   virtual B* Clone()
   {
       return new B(*this);
   }
};
 
class C: public A
{
public:
   virtual C* Clone()
   {
       return new C(*this);
   }
};
 
 
A *p1 = new B;
A *p2;
 
p2 = p1->Clone();
Поскольку ты на этапе исполнения не можеш предугадать что в p1 (C или B) ты не можеш написать
p2 = new B(*p1) или p2 = new C(*p1)
А с Clone все гут.
sledge
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 13
08.08.2009, 21:58  [ТС]     Вопросец о виртуальном конструкторе копировщике. #4
Дошло, похоже.
Прелесть виртуальной функции.
Копировщик(о котором упоминал Sekt), как любой конструктор, не может быть виртуальным. Поэтому исп. виртуальная функция, которая использует копировщик:

C++
1
return new C(*this);
!!!!НО!!!!!! Код Alexandoros 'а тоже не совсем верен, как мне думается.
Виртуальные шункции должны иметь одинаковую сигнатуру, т.е.
надо написать так:
C++
1
2
virtual B* Clone()   заменить на  virtual A* Clone()
virtual C* Clone()   заменить на  virtual A* Clone()
)

Или я ошибаюсь?
Спасибо всем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2009, 22:50     Вопросец о виртуальном конструкторе копировщике.
Еще ссылки по теме:

Двоеточие в конструкторе - C++
class A { public: A(): }; Что означает двоеточие и что туда надо писать?

Исключения в конструкторе - C++
Допустим, при конструировании объекта необходимо выделить память для двух указателей-членов и правильно обработать все ошибки исключений....

Шаблон в конструкторе - C++
class A { template <class Type> A(Type Object) { } friend class B; };

Ошибка в конструкторе - C++
Написал задачу, но она не работает. Условие: Разработать класс Элементарная частица с элементами Название, Группа, Заряд, Масса покоя....

Исключение в конструкторе - C++
#include <iostream> class Vect { public: Vect(char); ~Vect() { try { delete p; } catch (...) { std::cerr << "Cannot...

Исключения в конструкторе - C++
Приведите пожалуйста пример, где было бы видно как писать конструктор в классе (инициализация полями класса) используя исключения и нужны...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
08.08.2009, 22:50     Вопросец о виртуальном конструкторе копировщике. #5
Цитата Сообщение от sledge Посмотреть сообщение
Виртуальные шункции должны иметь одинаковую сигнатуру. Или я ошибаюсь?
Как правило, возвращаемый тип переопределяющей функции должен быть таким же, как и у функции, которую она переопределяет.
Однако для так называемых ковариантных возвращаемых типов это правило не настолько строгое.
подробности тут
Yandex
Объявления
08.08.2009, 22:50     Вопросец о виртуальном конструкторе копировщике.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru