пара нубских вопросов по с++
Со скобками получается прототип функции.
уже понял
када написал тама
B b(int a);
прикольный язык
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 и без него будет разное поведение.
эт именно то про что я спрашивал
большое спасиб
тащусь с с++ еще больше
т.е. зачем так? что-то вроде "если пометили virtual, то всё равно, как инициализирована та часть объекта"?
Ну, и проще формулировать условия вызова конструкторов в зависимости от наличие слова viirtual в наследовании, а не в зависимости от топологии дерева наследования.
Имхо, использовать виртуальное наследование без множественного наследования - это какое-то извращение.
То есть, правильнее было бы мне ответить BotWi так: формально, наличие virtual в наследовании легко приводит к различному поведению (я уж не говорю о разнице в поведении при приведения типов но вот только использовать виртуальное наследование вне контекста множественного наследования как то странно.
Имхо, использовать виртуальное наследование без множественного наследования - это какое-то извращение.ну у меня токо с virtual получилось реализовать final в c++
т.е. запретить наследоваться от класса
т.е. запретить наследоваться от классаСделай классу private constructor.
#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" перестает работать и код компилится и даж запускается
Сделай классу 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
а вот если раскомментить, т.е. убрать virtual, то "final" перестает работать и код компилится и даж запускаетсяПотому что
friend class OurClass
Если ты хочешь запретить наследование от OurClass, сделай ему private constructor.
А как тогда объекты создавать?Не путай. Задача: запретить наследование от класса. Объекты создавать статическим методом, например. (Да, я понял пример из ссылки, но мне он не нравится.)
Не путай. Задача: запретить наследование от класса.таки путаешь ты
почитай что такое final в java
я крут?
Дошло. Ну у тебя и вкусы
почитай что такое final в javaТы хотел сделать final или запретить наследование? Дело в том, что C++ отличается от Java, в нём свои приёмы программирования, вот я тебе их и предлагаю.
Оставить комментарий
pitrik2
почему так компилится, а без скобок, т.е. с расскомментированной строчкой не компилится?
и второе
где бы почитать что делает virtual в наследовании
про ромб во множественном наследовании я понял, а вот если у меня нет множественного вообще, то virtual что-либо будет означать или нет?
я думал что нет, а вот есть прога которая меняется када туда virtual вставить...
вот и думаю что надо чтото умное почитать чтоб понять чяднт