Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос
Qubc

Qubc

Ненавижу полисемию.
  • 4
    вклад
  • 112
    вопросов
  • 12
    ответов
  • 25%
    решений
Комментарии
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • Почему в Java изменение интерфейса базового класса посредством модификации сигнатуры разрешено?

    Qubc
    Qubc @Qubc Автор вопроса
    Всё понятно, большое спасибо.
    Получается, ты ответил на вопрос "Как в C++ получить доступ к перегрузка базового класса без overriding их в производном классе", который имеет практическую ценность.
    Получается, что только в джаве такой вопрос у меня в принципе не возник бы.
    Что касается эзотерики - то там верно заметили, что исходный вопрос (в той форме, в которой он был задан) является всё таки дурацким. Нужно было спрашивать конкретно по С++.
    Написано 16 июл.
  • Почему в Java изменение интерфейса базового класса посредством модификации сигнатуры разрешено?

    Qubc
    Qubc @Qubc Автор вопроса
    #include <iostream>
    
    class Animal {
        public: virtual void sound() {//  перегрузка раз
            std::cout << "Animal.sound()" << '\n';
        }
        public: virtual void sound(int i) {// перегрузка два
            std::cout << "Animal.sound(int)" << '\n';
        }
    };
    
    class Cat : public Animal{
        
        public: void sound () override {// overriding (а не redefinition) будет успешным: имя, параметры, возвращаемый тип есть в базовом классе, всё ок
            std::cout << "Cat.sound()" << '\n';
        }
    };
    
    int main() {
        Cat * cat1 = new Cat();
        cat1 -> sound(); // Cat.sound()
        //! cat1 -> sound(1); // no matching function for call to 'Cat::sound(int)'  
    /* 
    В книге Bruce Eckel  Thinking in C++, 2nd Edition это показано в NameHiding2.cpp и называется hiding, сокрытие. То есть если я хочу вызывать виртуальные методы у типов Cat, Cat * или Cat & - то мне нужно определить новую версию для каждой перегрузки. 
    */
        delete cat1;
    }


    В примере java происходит по-другому - оставшиеся методы не скрываются (на сколько я понимаю сейчас, в java нет разницы между redefinition и overriding просто потому что всё по умолчанию virtual). В итоге: можно сделать новую версию одной из перегрузок и продолжать пользоваться базовыми версиями.

    p.s. не "экранирование", а "сокрытие", извините.
    Написано 14 июл.
  • Почему в Java изменение интерфейса базового класса посредством модификации сигнатуры разрешено?

    Qubc
    Qubc @Qubc Автор вопроса
    Adamos, mayton2019, хорошо, спасибо, постараюсь не задавать тупые вопросы.
    И про принт - вы зря. Я много чего пробовал, просто стараюсь в вопросах писать как можно меньше и понятнее.
    Про переопределение - это вообще очевидно, что другая сигнатура не может переопределить. Странно что об этом вообще решили написать.
    Ответ по сути заключался в том, что одноимённые методы в джаве не экранируют методы базового класса, а в плюсах экранируют, вот и всё.
    Написано 14 июл.
  • Есть ли способ получать предупреждение при преобразовании char в int?

    Qubc
    Qubc @Qubc Автор вопроса
    Судя по вопросу для вас это одно и то же.

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

    Повышение char до int не зависимо от того какой конкретно char в данной системе вполне стандартизовано и укладывается в стандартное расширение целочисленных типов.

    Ну, то есть получается, что это implementation defined. То есть один и тот же код может давать разные результаты. Где-то -1 превратится в -1, а где-то в 255.

    Получается, единственный способ это ответ выше: https://qna.habr.com/answer?answer_id=2346206
    Написано 13 июл.
  • Есть ли способ получать предупреждение при преобразовании char в int?

    Qubc
    Qubc @Qubc Автор вопроса
    Adamos,
    2. Спасибо.
    3. Ругается на int -> char, но не ругается на char -> int.
    Написано 13 июл.
  • Почему -Wconversion разрешает передачу integer literal в char параметр?

    Qubc
    Qubc @Qubc Автор вопроса
    mayton2019, ахах, спасибо)
    Написано 12 июл.
  • Почему -Wconversion разрешает передачу integer literal в char параметр?

    Qubc
    Qubc @Qubc Автор вопроса
    Я просто каждый раз восхищаюсь твоей экспертностью. Прочитал твой ответ- понял, что ошибся с определением типа, понял почему 256 вызывает ворнин. То есть моя ошибка была в непонимании сути типов. Тем не менее это не очень интуитивно - кажется, что char это char, а int это int.
    Написано 12 июл.
  • Почему -Wconversion разрешает передачу integer literal в char параметр?

    Qubc
    Qubc @Qubc Автор вопроса
    mayton2019,
    попробуй virtual.

    не-не, речь шла о "не-тру" полиморфизме, в результате чего я уже написал код и у меня возник вопрос. Если бы я случайно дефинировал int переменную и увидел бы предупреждение, то я бы и тему не начал, и не знал бы, что такое игнорирование есть.
    Написано 12 июл.
  • Почему -Wconversion разрешает передачу integer literal в char параметр?

    Qubc
    Qubc @Qubc Автор вопроса
    mayton2019,
    class Base{
    public:
        void method(){}
        void method(int i){}
    };
    
    class Derived : public Base {
    public:
        void method(char c){}
    };
    
    int main(void) {
        Derived d;
        d.method(1);// хотел наглядно показать экранирование метода при redefinition (а не overriding) и удивился, что не возникает предупреждения несмотря на флаг.  Дальше полез гуглить - и понял, что не понимаю.
        return 0;
    }
    Написано 12 июл.
  • Почему -Wconversion разрешает передачу integer literal в char параметр?

    Qubc
    Qubc @Qubc Автор вопроса
    Sergio, warning: overflow in conversion from 'int' to 'char' changes value from '256' to ''\000'' [-Woverflow] f(256);
    Написано 12 июл.
  • Как получается формула N*(N-1) / 2?

    Qubc
    Qubc @Qubc Автор вопроса
    Спасибо, я так и попробовал, но подумал что это очень странно. Казалось, есть более правильный подход. Спасибо.
    Написано 08 июл.
  • Как упростить выражение с факториалами?

    Qubc
    Qubc @Qubc Автор вопроса
    Wataru, ахах, спасибо! Нужно было просто с другого конца делить)
    Написано 26 июн.
  • Как упростить выражение с факториалами?

    Qubc
    Qubc @Qubc Автор вопроса
    Lynn «Кофеман», я не понял вашу формулу, но всё равно спасибо, S_10 = 1 + 9!/10! + 8!/10! +... 1!/10! = 1 + 9!/( 9! * 10 ) + 8!/(10 * 9 * 8!) +...
    Написано 26 июн.
  • Что такое Exception in thread "main" java.lang.NoSuchFieldError: data at HelloApp.main(HelloApp.java:12)?

    Qubc
    Qubc @Qubc Автор вопроса
    Dmitry Roo, спасибо!
    Написано 26 июн.
  • Что такое Exception in thread "main" java.lang.NoSuchFieldError: data at HelloApp.main(HelloApp.java:12)?

    Qubc
    Qubc @Qubc Автор вопроса
    Спасибо, короче, пока буду в терминале всё делать, спасибо.
    Написано 26 июн.
  • Как упростить выражение с факториалами?

    Qubc
    Qubc @Qubc Автор вопроса
    Не понимаю(.

    После раскрытия скобок:
    S = n!/n! + 1!/n! + 2!/n! + ... + (n-1)!/n!
    S = 1 + 1!/n! + 2!/n! + ... + (n-1)!/n!

    Либо нужно вывести формулу следующего члена, либо всего ряда... Не понимаю.
    S1 = 1
    Sn+1 = S

    Как вообще это нужно понимать? Как формула члена последовательности? Или как формулу ряда? Не понимаю.
    Написано 22 июн.
  • Как упростить выражение с факториалами?

    Qubc
    Qubc @Qubc Автор вопроса
    Akina, если я правильно понял вопрос, то проблема будет в том, что первое слагаемое будет 1/n!, что опять же требует вычисление факториала n. При n = 300 будет переполнение. Иначе можно было бы легко найти факториал, а потом пошагово делить его и найти сумму в делимом.
    Написано 20 июн.
  • (Вопрос без однозначного ответа) Почему в window socket 2 используется так много различных дефайнов и псевдонимов?

    Qubc
    Qubc @Qubc Автор вопроса
    Спасибо за подробный ответ!
    Написано 15 июн.
  • Почему выражение (-1ll) в ассемблерном коде MSVC равно ff ff ff ff?

    Qubc
    Qubc @Qubc Автор вопроса
    Круто! Спасибо! А я уже напрягся, что не понимаю суффиксы.
    Написано 11 июн.
  • Правильно ли я понимаю правила arithmetic conversions?

    Qubc
    Qubc @Qubc Автор вопроса
    Огромное спасибо!
    Написано 11 июн.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • Следующие →
Самые активные сегодня
  • vabka
    Василий Банников
    • 6 ответов
    • 0 вопросов
  • dimonchik2013
    Dimonchik
    • 6 ответов
    • 0 вопросов
  • Роман Безруков
    • 4 ответа
    • 0 вопросов
  • MVV
    • 4 ответа
    • 0 вопросов
  • Mike_Ro
    Михаил Р.
    • 4 ответа
    • 0 вопросов
  • Rsa97
    Rsa97
    • 3 ответа
    • 0 вопросов
  • © Habr
  • О сервисе
  • Правила
  • Обратная связь
  • Блог

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации