forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Болтовня (http://forum.boolean.name/forumdisplay.php?f=25)
-   -   Статистический полиморфизм? (http://forum.boolean.name/showthread.php?t=20480)

Program23 15.11.2016 15:06

Статистический полиморфизм?
 
Препод задал вопрос, в какой строчке этого кода (C++) реализуется статический полиморфизм?

Код:

  #include"stdafx.h"
  #include<iostream>
  #include<clocale>
  #include<conio.h>
  #include<ctime>
 
  using namespace std;
 
  class pulsometer
  {
  public:
  int pulse;
  int calories;
  int timer;
  void show_pulse(void);
  void show_calories(void);
 
  void show_timer()
  {
        cout << "Таймер: " << timer << endl;
  }
 
  void start_timer()
  {
        timer = 10;
  }
 
  };
 
  void pulsometer::show_pulse(void)
 
  {
  pulsometer::pulse = rand() % 45 + 90;
  cout << "Пульс: " << pulse << endl;
  }
 
  void pulsometer::show_calories(void)
 
  {
  pulsometer::calories = rand() % 1000;
  cout << "Сожжено: " << calories << " ККал" <<  endl;
  }
 
  int_tmain(intargc, _TCHAR* argv[])
  {
        setlocale(0,"");
        srand( time( 0 ) );
              pulsometer polar;
 
        polar.start_timer();
        polar.show_timer();
 
        polar.show_pulse();
        polar.show_calories();
 
  _getch();
  return 0;
  }


ABTOMAT 15.11.2016 15:33

Ответ: Статистический полиморфизм?
 
Уж не там ли, где ты дописываешь методы show_pulse и show_calories уже после того, как класс описан?

Program23 15.11.2016 15:55

Ответ: Статистический полиморфизм?
 
Цитата:

Сообщение от ABTOMAT (Сообщение 310123)
Уж не там ли, где ты дописываешь методы show_pulse и show_calories уже после того, как класс описан?

Вот на StackOverflow спросил, там кто-то также сказал, объяснив это тем, что:
"Здесь, статический, потому что конечное действие определяется во время компиляции."

Но его минусанули, и правильным ответом выбрали:
"Здесь нет никакого полиморфизма: ни статического, ни динамического. Здесь нет ни наследования, ни перегруженных функций, ни шаблонных функций.
Полиморфизм означает много форм.
Здесь же имеется один класс - одна форма. Здесь есть лишь статическое связывание вызовов методов класса с объектом, имеющим статический тип данного класса."



И какой же ответ верный?

DarkInside 15.11.2016 16:01

Ответ: Статистический полиморфизм?
 
Ну так преподу и скажи - "Можно предположить, что ... но на самом деле здесь нет никакого полиморфизма, тк ...". Пусть сам выбирает правильный ответ. Чтобы научиться правильно вести демагогию - посмотри прямые линии с Путиным.

Program23 15.11.2016 16:07

Ответ: Статистический полиморфизм?
 
Цитата:

Сообщение от DarkInside (Сообщение 310126)
Ну так преподу и скажи - "Можно предположить, что ... но на самом деле здесь нет никакого полиморфизма, тк ..."

Она еб*тая молодая, ведет ООП и заставляет ходить на copy-paste лекции, на защите вместо кода дрючит сухой теорией и при этом задавая тупые вопросы.

А вот интересно: два конструктора в одном классе являются примером полиморфизма или нет?

Поштудировав интернет источники, я пришел к выводу, что есть два мнения:
1) да
2) нет, но многие считают это полиморфизмом.

Преподша сторонница второго варианта.

Knightmare 15.11.2016 21:01

Ответ: Статистический полиморфизм?
 
1. Человек не являющийся хотябы старшим разработчиком в коммерческой софтверной компании не должен вести программирование в универе.
2. Аспирантка имеющая 0 лет опыта коммерческой разработки тем более не должна его вести.
3. Тупа аспирантка трижды не должна вести этот предмет.
4. Полиморфизма там нет от слова совсем, статичный полиморфизм про другое.
5. Два конструктора тоже не являются полиморфизмом.

Randomize 15.11.2016 21:31

Ответ: Статистический полиморфизм?
 
Похоже эта задача на знание "трепонтни", а не программирования:
сводится к тому, чтоб показывая на любую строчку зачитать первый абзац википедии.
Показывай на места со статическими методами - там хоть 1 слово совпадает с темой вопроса.

Дискредитировать методы обучения - не лучшая тактика если нужен зачёт.
И ваще.. старший разработчик больше заработает старшим разработчиком чем учителем - естественно там бестолочь сидит, как будто что-то удивительное.

Knightmare 15.11.2016 21:36

Ответ: Статистический полиморфизм?
 
Цитата:

Сообщение от Randomize (Сообщение 310135)
Дискредитировать методы обучения - не лучшая тактика если нужен зачёт.

Ну, я успешно это делал, например. Для лулзов могу дать смишной вопрос с развернутым ответом чтобы сломать моск и порвать шаблоны в клочья преподу.
Цитата:

Сообщение от Randomize (Сообщение 310135)
И ваще.. старший разработчик больше заработает старшим разработчиком чем учителем - естественно там бестолочь сидит, как будто что-то удивительное.

В целом да, но обычно это делается для подтягивания толковых студентов в свою компанию до того, как до них доберутся другие. Дефицит как бэ. Ну и кому-то для понтов еще, да.

Program23 15.11.2016 22:55

Ответ: Статистический полиморфизм?
 
Цитата:

Во всех подобных строчках (оператор << перегружен): cout << "Таймер: " << timer << endl;
Господа, вот такой еще ответ предложили. Но что-то я не совсем понимаю, что имеется в виду.

UPD
Посоветовали книгу Бьерн Страуструп. Язык программирования С++
То есть, такие операторы как "+, *, <<" будут относиться к перегрузке оператора функции? Например "+", имеет одно имя, но используется для сложения целых чисел, чисел с плавающей точкой, и указателей. Следовательно, в моем коде, + и >> - являются примером статического полиморфизма?

А почему >> является перегруженным оператором сдвига влево?

RegIon 15.11.2016 23:02

Ответ: Статистический полиморфизм?
 
Цитата:

Сообщение от Program23 (Сообщение 310146)
Господа, вот такой еще ответ предложили. Но что-то я не совсем понимаю, что имеется в виду.

Имеется ввиду, что оператор << принимает параметр разных типов, т.е перегружен
Если верить
http://www.cyberforum.ru/cpp-beginne...ead879692.html
то это есть статический полиморфизм, так как видно заранее, что мы складываем в поток и КОМПИЛЯТОР подставляет реализацию.
Что-то типо такого получается:
Код:

cout.writeStr();
cout.writeInteger();
Cout.endl();

интересно, а если сделать так:
cout << (string) doubleVal;
это статика? Или уже динамика?

Knightmare 16.11.2016 11:08

Ответ: Статистический полиморфизм?
 
Перегрузка операторов не является статичным полиморфизмом (хотя подумалось что в целом с натяжной и можно наверное, таки тоже во время компиляции выбирается в зависимости от типов аргументов). Если уж хочется упороться по терминологии, то это параметрический полиморфизм (их очень много всяких разных в общем-то, хотя обычно в С++ под полиморфизмом понимается динамичный полиморфизм, т.е. виртуальные функции). Да и вообще мне представляется пиздец тупым дать пример кода, где ответ скрывается в стандартной библиотеке. А в классе pulsometer полиморфизма таки нет никакого. Но что там происходит в головушке у препода я хз, видел например такое в своей жизни. Есть код типа такого:
Код:

for(int i = 0; i < 1000; i++)
    for(int j = 0; j < 10; j++)
        foo();

Типа вопрос как оптимизировать можно. В целом идея в том, чтобы вложить циклы наоборот, т.к. ничего не изменится в работе, но теоретически меньше инициализаций счетчика будет во вложенном цикле, экономия на спичках, но идею показывает. Что написал препод? А вот такую хуйню и орал что именно так и должно быть и это труъ оптимизация, а все тупые:
Код:

for(int i = 0; i < 1000; i++)
{
    for(int j = 0; j < 10; j++)
    {
        foo();
    }
}

На самом деле вот пример статичного полиморфизма (он не совсем каноничный, но так понятнее зачем это надо и как работает):
Код:

#include <stdlib.h>
#include <stdio.h>

template <class T>
class Base
{
public:
    void foo()
    {
        static_cast<T*>(this)->foo();
    }
    void bar()
    {
            foo();
    }
};

class Derived1 : public Base<Derived1>
{
public:
    void foo()
    {
        printf("Derived1::foo();\n");
    }
};

class Derived2 : public Base<Derived2>
{
public:
    void foo()
    {
        printf("Derived2::foo();\n");
    }
};

int main()
{
    Derived1 a;
    Derived2 b;
   
    a.bar();
    b.bar();
   
    return 0;
}


impersonalis 16.11.2016 13:11

Ответ: Статистический полиморфизм?
 
Цитата:

Сообщение от Knightmare (Сообщение 310160)
Код:

for(int i = 0; i < 1000; i++)
    for(int j = 0; j < 10; j++)
        foo();

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

Если уж препод решил выпасть на умняк, синтезировав формальный пример, то:
мне думается, что т.к. foo() от i,j не зависит (формально это не показано), то компилятор это в один цикл свернёт, а если результат вызова foo() ещё и ни на что не влияет (что формально надо было бы показать возвратом значения в точку вызова, с последующим учётом этого результата), то вообще - выкинет оба цикла.

mr.DIMAS 16.11.2016 14:29

Ответ: Статистический полиморфизм?
 
Вот из-за этого я пошел на оптика учиться, а не на программера. Спорить по очевидным вещам с ебнутыми преподами не хотелось.

Knightmare 16.11.2016 15:15

Ответ: Статистический полиморфизм?
 
Цитата:

Сообщение от impersonalis (Сообщение 310162)
Если уж препод решил выпасть на умняк, синтезировав формальный пример, то:
мне думается, что т.к. foo() от i,j не зависит (формально это не показано), то компилятор это в один цикл свернёт, а если результат вызова foo() ещё и ни на что не влияет (что формально надо было бы показать возвратом значения в точку вызова, с последующим учётом этого результата), то вообще - выкинет оба цикла.

Ну, это все так, конечно оптимизирующий компилятор все сделает за тебя и даже лучше часто, но как теория для понимания почему бы и нет. Только надо нормально давать это, а не нести хуйню с умным видом.

DarkInside 16.11.2016 15:22

Ответ: Статистический полиморфизм?
 
Ты у неё спроси, а вот это полиморфизм? :-)
Код:

#define isdog 1
#define iscat 2


Type animal
    Public:
    speak As Sub()
    Declare Constructor (anid As Integer)   
End Type

'Speak метод для объекта dog(собаки)
Sub Bark()
    Print "Woof!"
End Sub

'Speak метод для объекта cat(кошки)
Sub Meow()
    Print "Meow!"
End Sub

'Установим указатель правильного метода, основанный на id животного
Constructor animal(anid As Integer)
    If anid = isdog Then
        this.speak = @Bark
    ElseIf anid = iscat Then
        this.speak = @Meow
    End If
End Constructor

'Создание объектов dog и cat
Dim myDog As animal = isdog
Dim mycat As animal = iscat

'Вывод того, что произносят животные
Print "My dog says ";
myDog.speak()
Print "My cat says ";
myCat.speak()

Sleep
End



Часовой пояс GMT +4, время: 09:56.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot