Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.snto-msu.net/showflat.php?Number=8124079&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Wed Apr 13 00:22:58 2016
Кодировка: Windows-1251
пара нубских вопросов по с++ - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
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
3

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

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
4

В ответ на:

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
-1

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
1

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
-2

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
 

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



Редактировал 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, в нем свои приемы программирования, вот я тебе их и предлагаю.

Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
2 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в