пара нубских вопросов по с++

pitrik2


class A
{
    private:
     A {}
};

class B: public A {
};

int main
{
// B b;
    B b;
    return 0;
}

почему так компилится, а без скобок, т.е. с расскомментированной строчкой не компилится?
и второе
где бы почитать что делает virtual в наследовании
про ромб во множественном наследовании я понял, а вот если у меня нет множественного вообще, то virtual что-либо будет означать или нет?
я думал что нет, а вот есть прога которая меняется када туда virtual вставить...
вот и думаю что надо чтото умное почитать чтоб понять чяднт

ppplva

Со скобками получается прототип функции.

pitrik2

мдяя
уже понял
када написал тама

B b(int a);

прикольный язык

trobak

virtual что-либо будет означать или нет?
если есть двойное наследование
class Granny {
public:
Granny {}
//another constructor
explicit Granny(int) { ... }
};
class Dad : public virtual Granny {
public:
Dad : Granny( 17 ) { ... }
};
class Boy : public Dad {
Boy : Dad {}
};
то наличие virtual наследования приводит к тому, что при конструирования Boy для Granny всегда вызывается конструктор по умолчанию Granny::Granny а не Granny::Granny (int) (если явно не указать в Boy какой конструктор для Granny вызывать).
Поэтому с virtual и без него будет разное поведение.

pitrik2

круто
эт именно то про что я спрашивал
большое спасиб
тащусь с с++ еще больше

klyv

а чем обосновывается такой подход?
т.е. зачем так? что-то вроде "если пометили virtual, то всё равно, как инициализирована та часть объекта"?

trobak

А затем, что виртуальное наследование сделано как раз для реализации иерархии типа "ромб", в которой основание ромба должно быть инициализировано ровно один раз. Ну, и использовать дефолтный конструктор для корневого класса, если явно не указан вызов другого конструктора, вроде как самое простое и более-менее логичное решение.
Ну, и проще формулировать условия вызова конструкторов в зависимости от наличие слова viirtual в наследовании, а не в зависимости от топологии дерева наследования.
Имхо, использовать виртуальное наследование без множественного наследования - это какое-то извращение.
То есть, правильнее было бы мне ответить BotWi так: формально, наличие virtual в наследовании легко приводит к различному поведению (я уж не говорю о разнице в поведении при приведения типов но вот только использовать виртуальное наследование вне контекста множественного наследования как то странно.

pitrik2

Имхо, использовать виртуальное наследование без множественного наследования - это какое-то извращение.
ну у меня токо с virtual получилось реализовать final в c++
т.е. запретить наследоваться от класса

kokoc88

т.е. запретить наследоваться от класса
Сделай классу private constructor.

pitrik2

ну вот мой код:

#include <iostream>

class OurClass;

class Ups {
private:
Ups { std::cout << "if you see me twice -> final doesn't work" << std::endl; }

friend class OurClass;
};

class OurClass : virtual private Ups {
//class OurClass : private Ups {
};

class D : public OurClass {
};

int main
{
OurClass our;
D d; // here goes compiler error

return 0;
}

компилятор нормуль ругается на создание D, т.е. "final" работает
а вот если раскомментить, т.е. убрать virtual, то "final" перестает работать и код компилится и даж запускается

ppplva

Сделай классу private constructor.
А как тогда объекты создавать?
	class Usable;

class Usable_lock {
friend class Usable;
private:
Usable_lock {}
Usable_lock(const Usable_lock&) {}
};

class Usable : public virtual Usable_lock {
// ...
public:
Usable;
Usable(char*);
// ...
};

Usable a;

class DD : public Usable { };

DD dd; // error: DD::DD cannot access
// Usable_lock::Usable_lock: private member

http://www.research.att.com/~bs/bs_faq2.html#no-derivation

kokoc88

а вот если раскомментить, т.е. убрать virtual, то "final" перестает работать и код компилится и даж запускается
Потому что
friend class OurClass

Если ты хочешь запретить наследование от OurClass, сделай ему private constructor.

kokoc88

А как тогда объекты создавать?
Не путай. Задача: запретить наследование от класса. Объекты создавать статическим методом, например. (Да, я понял пример из ссылки, но мне он не нравится.)

pitrik2

Не путай. Задача: запретить наследование от класса.
таки путаешь ты
почитай что такое final в java

pitrik2

о, у меня получилось так же как у них
я крут? :)

ppplva

Дошло. Ну у тебя и вкусы :smirk:

kokoc88

почитай что такое final в java
Ты хотел сделать final или запретить наследование? Дело в том, что C++ отличается от Java, в нём свои приёмы программирования, вот я тебе их и предлагаю.
Оставить комментарий
Имя или ник:
Комментарий: