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

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

Страницы: 1 2 3 4 5 6
#75
5:39, 5 фев. 2012

Kartonagnick
> Вполне достаточно знать, что у объекта есть метод.
В случае статически типизированных наличие метода у объекта определяется его типом. Т.е., сначала тип, а потом метод.


#76
5:45, 5 фев. 2012

Grey304
> Плюсы - статически типизированный. И такой ерунды не допускают.

Вообще то, то был именно приплюснутый код. И вах! Работает!

Grey304
> И [b]компилятор[/b] как раз знает все в момент инстанцирования.

Внимательно читаем вопрос:

Kartonagnick
> На кой болт [b]программисту[/b] знать тип объекта? Вполне достаточно знать, что у
> объекта есть метод.

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

#77
5:53, 5 фев. 2012

>> Kartonagnick: Cfyz, Ты реально тупой?
Нереально. Однако, сколь уважительно -- по местоимению с большой буквы! Но вернемся к делу.

>> Компилятор "Work()" за программиста не впишет
То есть ты все-таки понимаешь, что вызвать черти-что иногда невозможно и метод, как ни крути, должен существовать. Уже хорошо.

>> (a) На кой <...> объекту <...> общий интерфейс? Вполне достаточно иметь свой собственный, ни с кем никак не связанный.
>> (b) Ты не знаешь его настоящего типа. Но знаешь, что у него есть метод test();
Я вот только понять не могу -- ты таки допускаешь, что метода у конкретного объекта может и не быть (a) или нет (b)?

И, вот честно признаюсь, ты меня удивляешь все более и более. Если ты сам додумался до выхода с вызовом функции через шаблонную функцию-обертку, то что еще тебе надо? Если в твоем мире виртуальный полиморфизм -- порнография не меньшая, чем dynamic_cast, и как следствие, вызываемая функция неизбежно невиртуальная, то с какого перепугу она не сработает при вызове по ссылке, как в коде, что ты сам же и написал?

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

>> Я уже понял, что народ не в состоянии выйти за привычные рамки прессованного классическими идеями воззрения.
Наверное да, каждый человек вправе называть себя народом. Это конечно шутка, а вот то, что ты пытаешься перенести привычные тебе идеи на непривычный тебе язык -- это уже ни разу не шутка, это самая что ни на есть печаль.

>> Народ просто не осознаёт, в чем заключается идея поставленной задачи.
Вот если бы ты ее еще прямо и ясно сформулировал -- было бы вообще шикарно.

#78
5:54, 5 фев. 2012

Kartonagnick
Это лишь значит, что ты не можешь сказать то, что имеешь в виду.

#79
5:54, 5 фев. 2012

Kartonagnick
> Народ просто не осознаёт, в чем заключается идея поставленной задачи.
А может, это не народ не осознает идею, а вам непонятны термины, которые вашу задачу описывают, и которую уже решили?
Погуглите по термину "утиная типизация". И если это просветления вам не поможет достичь, то я уж и не знаю.
Только в С++ ее нету. Только в шаблонах.

#80
6:36, 5 фев. 2012

Kartonagnick
К вопросу о типизации C++

class Base1
{
public:
  void Test()
  {
    std::cout << "Base1" << std::endl;
  }
};

class Base2
{
public:
  void Test()
  {
    std::cout << "Base2" << std::endl;
  }
};

class Child:public Base1,public Base2
{
};

Метод Test присутствует в классе Child наследованном от Base1 и Base2
Какой из методов Test ты хочешь вызвать не зная тип, но зная что метод в экземпляре присутствует?

#include <iostream>
class Base1
{
public:
  void Test()
  {
    std::cout << "Base1" << std::endl;
  }
};

class Base2
{
public:
  void Test()
  {
    std::cout << "Base2" << std::endl;
  }
};

class Child:public Base1,public Base2
{
public:
  void Test()
  {
    std::cout << "Child" << std::endl;
  }
};

можно еще так сделать :)
А самое интересное, что для экземпляра класса Child можно вызвать аж 3 разных метода Test.

#81
11:30, 5 фев. 2012

Kartonagnick
вот такой синтаксис подойдет?

class Base
{
public:
  virtual ~Base(){}
};

METHOD(foo);
METHOD(test);

class Derived1 : public Base, 
  HAS(test) 
{
public:
  void test(){ cout << "Derived1::test\n"; }
};

class Derived2 : public Base, 
  HAS(foo),
  HAS(test) 
{
public:
  void test(){ cout << "Derived2::test\n"; }
  void foo(){ cout << "Derived2::foo\n"; }
};

int main()
{
  Base* b0 = new Base();
  Base* b1 = new Derived1();
  Base* b2 = new Derived2();

  CALL(b0, test);  // do nothing
  CALL(b0, foo);   // do nothing

  CALL(b1, test); // call Derived1::test
  CALL(b1, foo);  // do nothing

  CALL(b2, test); // call Derived2::test
  CALL(b2, foo);  // call Derived2::foo
}
#82
15:04, 5 фев. 2012

Автор, объясни-ка внятно и красиво, в чем заключается постановка твоей задачи?

#83
20:45, 5 фев. 2012

sildc
>Метод Test присутствует в классе Child наследованном от Base1 и Base2
>Какой из методов Test ты хочешь вызвать не зная тип, но зная что метод в экземпляре присутствует?

Ты обломал весь прикол. Он (Kartonagnick) бросит ведь теперь изучение классов.

eXmire
>Автор, объясни-ка внятно и красиво, в чем заключается постановка твоей задачи?

Извините, что отвечаю за атора, но: он хочет отвязсться от типов в с++. И иметь код типа:

void *pointer;
pointer = new что-нибуть
pointer->всё_что_нужно();
// и самое зашибись
pointer2=any_func(pointer); // универсальная функция, возвращающая указатель на любую переменную любого типа, котора нужна автору

Всётаки хочу заметить, что ты Kartonagnick начал решать задачу уж слишком альтернативно. Я намекал на это в своём первом посте, но что-то ты всё проигнорировал. Стоит либо перечитать теорию по C++, либо скажи что-ты хочешь сделать, а мы тебе ответим как это можно сделать наиболее корректно. А всякие говнокодовые программы сильно потом сбоят. Просто сейчас ты потратишь слишком много времени на то чтобы осознать что всётаки сначало изучают, а потом применяют.

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

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