LINUX.ORG.RU

virtual void push ( T ) = 0;

 


0

2

Прочитал,

Обозначение =0 показывает, что для виртуальной функции не требуется никакого определения.

Это что значит, что можно и не переопределять функцию?

Почитай, что такое интерфейс (с точки зрения теоретического ООП), почитай что такое абстрактный класс, почитай что такое полиморфизм, почитай что такое обобщение, тогда и поймешь зачем это нужно и то что это значит.

В кратце - класс с чисто виртуальной функцией является абстрактным, точнее «=0;» позволяет тебе не делать описание (тело) функции вообще. Но класс будет абстрактным и создать его экземпляр нельзя, но можно отнаследовать от него и описать определение там.

Dudraug ★★★★★
()
Последнее исправление: Dudraug (всего исправлений: 1)
Ответ на: комментарий от Dudraug

позволяет тебе не делать описание (тело) функции вообще.

А ну тоесть, переопределить значит можно. А то я что-то не мог представить, как это, не писать функцию и использовать ее.

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

u0atgKIRznY5
() автор топика

Обозначение =0 показывает, что для виртуальной функции не требуется никакого определения.

Не требуется, но возможно. Вообще смысл в том, что требуется определение в каком-нибудь производном классе.

xaizek ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

а так побыстрому узнать у тебя.

Если ты хочешь стать программистом, то побыстрому нельзя. Побыстрому разбираться не хорошо. Точнее иногда катит и хорошо, но не с твоим уровнем.

Почитай про полимофризм, интерфейсы и обобщение(наследование). Иначе ты нифига не поймешь что это и зачем это.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Я щас читаю то что читаю, я про это читал, но щас заного читаю и другую книгу, потому как немогу вспомнить что-то. А так вопросы, которые я задал тебе, щас проверю в коде и все узнаю.

u0atgKIRznY5
() автор топика

Например, у вас есть класс Фигура и отнаследованные от Фигуры классы Квадрат и Круг. Есть виртуальный метод Нарисовать. Так вот для Квадрата и Круга это будет реальная функция, кот. будет рисовать, например, на канве круг или квадрат. Для класса Фигура по логике мы не можем написать реальную функцию, кот. что-то будет выводить, потому что мы не знаем что именно рисовать. Для этого и существует понятие чисто абстрактная виртуальная функция.

plgrm44
()
Ответ на: комментарий от u0atgKIRznY5

Я щас читаю то что читаю, я про это читал, но щас заного читаю и другую книгу, потому как немогу вспомнить что-то

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

Dudraug ★★★★★
()
Ответ на: комментарий от plgrm44

кот. что-то будет выводить

Не будет, они только спят, жрут и срут.

А если серьезно, вот оно по сути объяснение с точки зрения понятия интерфйса и отчасти полимофризма. Но не факт что он поймет.

Dudraug ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

То что в мейне не указатель на базовый.

Dudraug ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

pa xa = new pa ();

Тут. Про указатели и систему типов читай. А вообще - читай любую книгу по C++, и пока не прочитаешь хотя бы половину - не пиши тут лучше. Толку с этого будет 0.

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 1)
Ответ на: комментарий от dzidzitop

Тут. Про указатели и систему типов читай.

А почему так

pa *xa = new pa ();
Я как то видел что пишут так pa xa = new pa ( ), или это в другом случае?

u0atgKIRznY5
() автор топика

нет умственных способностей купить и почитать учебник С++ до КОНЦА ?

anonymous
()
Ответ на: комментарий от Dudraug

А вот например, я в си извлекал значения из строки так

char s[] = "position 66 in 86 statick";
int a;
int b;
sscanf ( s, "position %d in %d", &a, &b );
И получал значения для переменных. А как в c++ так делается?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

А как в c++ так делается?

Либо стринговый стрим с пропуском ненужных частей, либо регулярки (есть в стандарте), либо те же функции из С.

anonymous
()
Ответ на: комментарий от lberserq

самый прикол что тело можно определить, прямо для этого класса

Ага, можно, но класс все равно будет абстрактым, т.е. экземпляр создать нельзя (хоть и определение метода есть), потому что объявление чисто виртуальное.

anonymous
()

Топикстартер, начни с видеокурса https://stepik.org/course/3206/ (точнее тебе нужна первая часть). Курс отличный (потому что его питерцы делали). Там дядька очень хорошо объясняет. Даже читать почти не нужно (но голову все равно включить придется).

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

Вот в c# например надо ovveride писать, чтобы переопределить виртуальную функцию. В с++?

Необязательно, но можно:

struct base {
  virtual void snake() = 0;
};

struct pa : base {
  void snake() override {}
};

int main() { base* xa = new pa; }

KennyMinigun ★★★★★
()

=0 означает, что тела функции нет, а класс — абстрактный, т. е. нельзя создать его экземпляр (но можно ссылку либо указатель). Так делают, например, чтобы определить интерфейс, а возможные реализации оставить классам-наследникам, которые уже будут делать, что надо, в зависимости от своих специфик. Например, ты описываешь интерфейс ввода-вывода, а в наследниках реализуешь конкретику (работа с файлами, БД, сетью, etc), а дальше в своём коде используешь только описание интерфейса, не заботясь о реализации

XMs ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Какая здесь ошибка?

Ошибка вот здесь:

pa xa = new pa ();

Должно быть хотя бы так:

pa* xa = new pa ();

А вообще в случае использования виртуальных функций обычно пранируется использовать их через «интерфейс» — базовый класс.

https://wandbox.org/permlink/vr5k1u5XycyXPxR1

struct Base {
    virtual const char * whoami() const = 0;
};

struct Foo : Base {
    const char * whoami() const override { return "I am Foo"; }
};

struct Bar : Base {
    const char * whoami() const override { return "I am Bar"; }
};

int main() {
    std::array<Base*, 2> objects = { new Foo, new Bar };
    for (Base* object : objects) {
        std::cout << object->whoami() << '\n';
    }
}

// Выводит
// I am Foo
// I am Bar

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от XMs


=0 означает, что тела функции нет

Не означает,тело можно доопределить в этом же классе

lberserq
()
Ответ на: комментарий от u0atgKIRznY5

Я как то видел что пишут так pa xa = new pa ( ), или это в другом случае?

И смешались в кучу ява и прочие животные.

andreyu ★★★★★
()
Ответ на: комментарий от Dudraug

Вы какую-то тупню бедному ТС-у городите, он так вовек не поймёт, в обычном учебнике так: 0(зиро), для затравки что есть «тип», а далее по «привязке» «тип», ну, к примеру «левая», то по подразумеватся будет «правая». И если даже «тип»(с самого начала) «правая», то будет всегда опять же подразумеваться «левая», что есть такой «тип».(Явно не отображен, который.)

anonymous
()
Ответ на: комментарий от plgrm44

Для класса Фигура по логике мы не можем написать реальную функцию, кот. что-то будет выводить, потому что мы не знаем что именно рисовать.

Как не можем? `Нарисовать` может оперировать экземплярами классов Drawer и Drawable, а реализация будет находиться в каком-то из этих классов. Это вопрос декомпозиции задачи, как её решать.

Virtuos86 ★★★★★
()
Ответ на: АХААХАХ от BruteForce

Да что же ты творишь, с последнего абзаца я просто впал в истерику.

Bfgeshka ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Ты не можешь создать экземпляр класса, если в нем есть абстрактные методы. Только если они все переопределены в потомке (и ты, соответственно, будешь создавать экземпляр этого потомка).

P. S.: первый комментарий самый адекватный.

KivApple ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Что за кашу я сейчас прочитал? Все блин просто

class A {
    virtual void a() = 0;
    virtual void b() {
        return;
    }
}
Теперь если ты сделаешь class B который наследуется от А, то в нем и «a» и «b» функции будут унаследованы от А если ты их явно не переопределишь. Что тут непонятного может быть?

Aswed ★★★★★
()

Я просто удивляюсь степени дебильности цпп как языка. Почему нельзя было сделать как в шарпе - abstract type methodName();, лолмлять, это же реально сидели люди в кругу и думали, как сделать астрактные методы и решили придумать этот бред про приравнвание к нулю. Я даже не спрашиваю, почему ноль, а не минус или плюс один.

nikolnik ★★★
()
Ответ на: комментарий от nikolnik

Почему нельзя было сделать как в шарпе

Потому что Страуструп хотел сделать новый лучший C#, не повторяя его ошибки дизайна

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Нет, просто хотел сделать не как в Микрософт, где работал! А то бы они его засудили!

fluorite ★★★★★
()

Все отписавшиеся выше с хулой — просто хейтеры. Ребят, вы не понимаете, что за этим парнем будущее. Он и есть будущее. Посмотрите хотя бы на сайт:

https://naidv88.wixsite.com/xverizex
© 2023 Дмитрий.

Deleted
()
Ответ на: комментарий от nikolnik

А чем лучше это ваше abstract ? Писать больше, так как индусам платят за число символов в коде?

CatsCantFly
()
Последнее исправление: CatsCantFly (всего исправлений: 2)
Ответ на: комментарий от nikolnik

0 - отсутствие реализации. Логично и лаконично. Писать abstract, потом вы еще предложите begin - end вместо каких-то непонятных кавычек писать...

plgrm44
()
Ответ на: комментарий от Virtuos86

Что за Drawer? Вы о чем? Если вы имеете в виду, что можно вызвать у базового класса виртуальную функцию потомка, так это не значит, что базовый класс Фигура внутри своего класса знает, что надо рисовать.

plgrm44
()
Ответ на: комментарий от plgrm44

То бишь ключевое слово abstract в определении класса вас не смущает, а в определении метода - да :) Это только упоротые сишники придают мистический смысл числу 0 везде.

nikolnik ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.