botWi
|
|
|
|
|
Рег.: 22.11.2003
|
Сообщений: 10160
|
Из: Moscow
|
Рейтинг: 1764
|
|
пара нубских вопросов по с++
02.12.2008 12:43
|
|
|
code:
class A
{
private:
A() {}
};
class B: public A {
};
int main()
{
// B b;
B b();
return 0;
}
почему так компилится, а без скобок, т.е. с расскомментированной строчкой не компилится?
и второе где бы почитать что делает virtual в наследовании про ромб во множественном наследовании я понял, а вот если у меня нет множественного вообще, то virtual что-либо будет означать или нет? я думал что нет, а вот есть прога которая меняется када туда virtual вставить... вот и думаю что надо чтото умное почитать чтоб понять чяднт
|
Хватит дрочить на рейтинги |
|
Kai
|
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 8251
|
|
Рейтинг: 818
|
|
Re: пара нубских вопросов по с++
[re: botWi]
02.12.2008 12:50
|
|
|
Со скобками получается прототип функции.
|
|
botWi
|
|
|
|
|
Рег.: 22.11.2003
|
Сообщений: 10160
|
Из: Moscow
|
Рейтинг: 1764
|
|
Re: пара нубских вопросов по с++
[re: Kai]
02.12.2008 12:54
|
|
|
мдяя уже понял када написал тама
code:
B b(int a);
прикольный язык
|
Хватит дрочить на рейтинги |
|
Misha
|
addict
|
|
|
|
Рег.: 29.08.2002
|
Сообщений: 600
|
|
Рейтинг: 63
|
|
Re: пара нубских вопросов по с++
[re: botWi]
02.12.2008 18:08
|
|
|
В ответ на:
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 и без него будет разное поведение.
|
|
botWi
|
|
|
|
|
Рег.: 22.11.2003
|
Сообщений: 10160
|
Из: Moscow
|
Рейтинг: 1764
|
|
Re: пара нубских вопросов по с++
[re: Misha]
02.12.2008 18:46
|
|
|
круто эт именно то про что я спрашивал большое спасиб
тащусь с с++ еще больше
|
Хватит дрочить на рейтинги |
|
Yorik
|
|
|
|
|
Рег.: 01.09.2005
|
Сообщений: 2476
|
Из: Москва
|
Рейтинг: 633
|
|
Re: пара нубских вопросов по с++
[re: Misha]
02.12.2008 21:29
|
|
|
а чем обосновывается такой подход? т.е. зачем так? что-то вроде "если пометили virtual, то все равно, как инициализирована та часть объекта"?
|
|
Misha
|
addict
|
|
|
|
Рег.: 29.08.2002
|
Сообщений: 600
|
|
Рейтинг: 63
|
|
Re: пара нубских вопросов по с++
[re: Yorik]
04.12.2008 09:25
|
|
|
А затем, что виртуальное наследование сделано как раз для реализации иерархии типа "ромб", в которой основание ромба должно быть инициализировано ровно один раз. Ну, и использовать дефолтный конструктор для корневого класса, если явно не указан вызов другого конструктора, вроде как самое простое и более-менее логичное решение. Ну, и проще формулировать условия вызова конструкторов в зависимости от наличие слова viirtual в наследовании, а не в зависимости от топологии дерева наследования. Имхо, использовать виртуальное наследование без множественного наследования - это какое-то извращение. То есть, правильнее было бы мне ответить BotWi так: формально, наличие virtual в наследовании легко приводит к различному поведению (я уж не говорю о разнице в поведении при приведения типов), но вот только использовать виртуальное наследование вне контекста множественного наследования как то странно.
|
|
botWi
|
|
|
|
|
Рег.: 22.11.2003
|
Сообщений: 10160
|
Из: Moscow
|
Рейтинг: 1764
|
|
Re: пара нубских вопросов по с++
[re: Misha]
04.12.2008 14:40
|
|
|
В ответ на:
Имхо, использовать виртуальное наследование без множественного наследования - это какое-то извращение.
ну у меня токо с virtual получилось реализовать final в c++ т.е. запретить наследоваться от класса
|
Хватит дрочить на рейтинги |
|
Mike
|
Ызарг
|
|
|
|
Рег.: 02.11.2002
|
Сообщений: 8098
|
|
Рейтинг: 2147
|
|
Re: пара нубских вопросов по с++
[re: botWi]
04.12.2008 14:49
|
|
|
Quote:
т.е. запретить наследоваться от класса
Сделай классу private constructor.
|
|
botWi
|
|
|
|
|
Рег.: 22.11.2003
|
Сообщений: 10160
|
Из: Moscow
|
Рейтинг: 1764
|
|
Re: пара нубских вопросов по с++
[re: Mike]
04.12.2008 16:08
|
|
|
ну вот мой код:
code:
#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" перестает работать и код компилится и даж запускается
|
Хватит дрочить на рейтинги |
|
Kai
|
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 8251
|
|
Рейтинг: 818
|
|
Re: пара нубских вопросов по с++
[re: Mike]
04.12.2008 16:11
|
|
|
Quote:
Сделай классу private constructor.
А как тогда объекты создавать?
code: 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
|
|
Mike
|
Ызарг
|
|
|
|
Рег.: 02.11.2002
|
Сообщений: 8098
|
|
Рейтинг: 2147
|
|
Re: пара нубских вопросов по с++
[re: botWi]
04.12.2008 16:13
|
|
|
Quote:
а вот если раскомментить, т.е. убрать virtual, то "final" перестает работать и код компилится и даж запускается
Потому что
code: friend class OurClass
Если ты хочешь запретить наследование от OurClass, сделай ему private constructor.
|
|
Mike
|
Ызарг
|
|
|
|
Рег.: 02.11.2002
|
Сообщений: 8098
|
|
Рейтинг: 2147
|
|
Re: пара нубских вопросов по с++
[re: Kai]
04.12.2008 16:14
|
|
|
Quote:
А как тогда объекты создавать?
Не путай. Задача: запретить наследование от класса. Объекты создавать статическим методом, например. (Да, я понял пример из ссылки, но мне он не нравится.)
|
|
botWi
|
|
|
|
|
Рег.: 22.11.2003
|
Сообщений: 10160
|
Из: Moscow
|
Рейтинг: 1764
|
|
Re: пара нубских вопросов по с++
[re: Mike]
04.12.2008 16:56
|
|
|
В ответ на:
Не путай. Задача: запретить наследование от класса.
таки путаешь ты почитай что такое final в java
|
Хватит дрочить на рейтинги |
|
botWi
|
|
|
|
|
Рег.: 22.11.2003
|
Сообщений: 10160
|
Из: Moscow
|
Рейтинг: 1764
|
|
Re: пара нубских вопросов по с++
[re: Kai]
04.12.2008 16:57
|
|
|
о, у меня получилось так же как у них я крут?
|
Хватит дрочить на рейтинги |
|
Kai
|
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 8251
|
|
Рейтинг: 818
|
|
Re: пара нубских вопросов по с++
[re: Mike]
04.12.2008 17:12
|
|
|
Дошло. Ну у тебя и вкусы
Редактировал Kai (04.12.2008 17:39)
|
|
Mike
|
Ызарг
|
|
|
|
Рег.: 02.11.2002
|
Сообщений: 8098
|
|
Рейтинг: 2147
|
|
Re: пара нубских вопросов по с++
[re: botWi]
04.12.2008 17:53
|
|
|
Quote:
почитай что такое final в java
Ты хотел сделать final или запретить наследование? Дело в том, что C++ отличается от Java, в нем свои приемы программирования, вот я тебе их и предлагаю.
|
|