Войти
ПрограммированиеФорумОбщее

Полиморфизм с++ Что не так с этим кодом? (2 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#15
10:39, 3 фев. 2012
  Derived* ptr = new Derived();
  (ptr->clone())->Test();
  Больше никак.

#16
10:41, 3 фев. 2012

Stuw
> Если ты собрался работать с интерфейсом, работай с интерфейсом, а не пытайся
> вылезти за его пределы.

Я собрался найти ответ, на чотко поставленный вопрос. Шо за манера дураццкая? Задаёшь один вопрос, ответы вапще на другие вопросы

#17
10:42, 3 фев. 2012

Zefick
> Больше никак.

Ну а если даже, пусть и не портируемый полухаккерский трюк?
Хоть что нибудь можно придумать?

#18
10:44, 3 фев. 2012

Kartonagnick
> Хоть что нибудь можно придумать?

тут не придумывать нужно, тут подумать нужно :)

#19
10:47, 3 фев. 2012

innuendo
> тут не придумывать нужно, тут подумать нужно :)

Ну це пись пись же умеет как то определять фактический тип объекта.
Значит можно как то его выудить!

Вооот... надо подумать))

#20
10:48, 3 фев. 2012
Base* ptr;
if(rand()%2)
    ptr = new Derived;
else
    ptr = new Base;

(ptr->clone())->Test();
Как можно надеятся обойти это ограничение? Если компилятор не знает на этапе компиляции, какого типа объект.
#21
11:06, 3 фев. 2012

действительно, это цэ пись пись :)

#22
11:10, 3 фев. 2012

Kartonagnick
> Ну а если даже, пусть и не портируемый полухаккерский трюк?
  Так ты уже предложил сам, что ещё надо?

  По моему тема начинает откровенно скатываться в ещё большее трололо, чем она была с самого начала.
#23
12:13, 3 фев. 2012

Kartonagnick
> Нет. Формально там Derived*. Но компилятор почему то парсит в Base*
> Типа правила языка такие на этот случай предусмотрены.
>
> ((Derrived*)(ptr->clone()))->Test(); //вот так можно.

Так нельзя. Компилятор правильно делает, Base - интерфейс для работы с группой классов. Решений несколько

В твоем случае наиболее правильным будет

struct BaseEx: public Base
{
  virtual void Test() const =0;
};
struct Derived : public BaseEx
{
...
};
...
void main()
{
  Base* ptr;
...
  if(BaseEx *pDeri = dynamic_cast<BaseEx*>(ptr)) 
  {
    pDeri->Test();
  }
}
#24
15:21, 3 фев. 2012

Kartonagnick
> Stuw
> > Если ты собрался работать с интерфейсом, работай с интерфейсом, а не пытайся
> > вылезти за его пределы.
>
> Я собрался найти ответ, на чотко поставленный вопрос. Шо за манера дураццкая?
> Задаёшь один вопрос, ответы вапще на другие вопросы

Я на это отвечал:
Kartonagnick
> ((Derrived*)(ptr->clone()))->Test(); //вот так можно.
>
> Как сделать тоже самое, ток без явного приведения?

#25
17:18, 3 фев. 2012

Stuw
> делать dynamic_cast
Не обязательно:

template <typename T> class Base {
public:
  virtual T* clone() = 0;
};

class Derived : public Base<Derived> {
public:
  Derived* clone() { return new Derived; }
  int test() { return 1; }
};

int main()
{
  Derived *foo = new Derived;
  return foo->clone()->test();
}
#26
17:51, 3 фев. 2012

KpeHDeJIb
с шаблоном не айс, ибо смысл теряется. Смысл как раз таки в том, что бы "не ведая типа" в рантайме толкнуть метод, который знание об этом самом типе вернет.

В псевдокоде это могло бы выглядеть вот так: 

int main()
{
  Base*foo = new Derived;

   ( typeof(foo) ) newFoo;

   newFoo.test();
}

Но на с++ нет такой конструктивы, которая бы вернула знание о типе так, что бы его можно было нормально использовать.
Я пробовал сам задавать свой костыльный typeof , но все мои потуги разбивались о неприступную "требуется константа времени компиляции". И хоть ты тресни!

Неее, ну сделать что то типа вот такого: 

myClass obj;   typeof(obj) newObj; //будит создан новый объект такого же типа, как указанный в аргументе
Не сложно. Но опять таки, подобная конструктива выдаст тип Base, а не Derived

Вот интересно, что нить подобное где нибудь реализовано на с++ ? Что б хотя бы какое то решение подсмотреть...

#27
18:03, 3 фев. 2012

Kartonagnick
> Смысл как раз таки в том, что бы "не ведая типа" в рантайме толкнуть метод,
> который знание об этом самом типе вернет.
Вендошная Component Object Model не подойдет? Через IUnknown всегда можно спросить GUID объекта.

Kartonagnick
> Неее, ну сделать что то типа вот такого:
> myClass obj; typeof(obj) newObj; //будит создан новый объект такого же типа,
> как указанный в аргументе
>
> Не сложно. Но опять таки, подобная конструктива выдаст тип Base, а не Derived
Не улавливаю. У нас есть MyClass*. Мы не должны делать предположений об фактическом типе за указателем, потому что там может быть все, что угодно. (Можно делать предположения о типе, но без проверки не стоит, имхо). Поэтому Derived* можно получить только через dynamic_cast и аналоги.

#28
18:07, 3 фев. 2012

Kartonagnick

чем это

 Base*foo = new Derived;
 ( typeof(foo) ) newFoo;
 newFoo.test();

отличается от этого

 Base* foo = new Derived;
 Derived& newFoo = dinamic_cast<Derived&>(*foo);
 newFoo.test();
?
#29
18:12, 3 фев. 2012

LuckyMan, в первом случае вызывающая сторона в рантайме вычисляет "истинный" тип foo.
Во втором случае - явно указывается программистом

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.