Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, blacksun, Вы писали:
B>>Задали вопрос на собеседовании, я до сих пор в сомнениях. Ответил что все наследуется, хотя сейчас сомнительно насчет недефолтовых конструкторов.
AG>дружба не наследуется.
А как же это работает тогда:
class FT;
class FT2;
class BestFr
{
public:
void func(FT2 & ft);
};
class FT
{
int m_x;
friend class BestFr;
//friend void BestFr::func(FT &);
};
class FT2 : public FT
{
};
void BestFr::func(FT2 & ft)
{
ft.m_x = 99;
}
int _tmain(int argc, _TCHAR* argv[])
{
FT2 ft2;
BestFr bf;
bf.func(ft2); // после вызова в ft2.m_x лежит 99 !!!return 0;
}
Здравствуйте, blacksun, Вы писали:
B>Здравствуйте, Alexander G, Вы писали:
AG>>Здравствуйте, blacksun, Вы писали:
B>>>Задали вопрос на собеседовании, я до сих пор в сомнениях. Ответил что все наследуется, хотя сейчас сомнительно насчет недефолтовых конструкторов.
AG>>дружба не наследуется.
B>А как же это работает тогда:
B>
B>class FT;
B>class FT2;
B>class BestFr
B>{
B>public:
B> void func(FT2 & ft);
B>};
B>class FT
B>{
B> int m_x;
B> friend class BestFr;
B> //friend void BestFr::func(FT &);
B>};
B>class FT2 : public FT
B>{
B>};
B>void BestFr::func(FT2 & ft)
B>{
B> ft.m_x = 99;
B>}
B>int _tmain(int argc, _TCHAR* argv[])
B>{
B> FT2 ft2;
B> BestFr bf;
B> bf.func(ft2); // после вызова в ft2.m_x лежит 99 !!!
B> return 0;
B>}
B>
Наследование интерфейса, нафиг!
Похоже, наследование приватных данных проходит как часть наследования реализации.
Но дружба ломает эту парадигму, и сама криво наследуется.
Видимо, друга базового класса нужно понимать как нечто вроде части реализации базового класса.
Здравствуйте, blacksun, Вы писали:
AG>>дружба не наследуется.
B>А как же это работает тогда: B>...
"Дружба не наследуется" нужно понимать так, что друзья базового класса не являются автоматически друзьями производных. В приведенном тобой примере друг базового класса получает доступ к закрытому члену базового же класса, так что все правильно. Доступ же к закрытым членам производного класса закрыт для друга базового:
class FT
{
private:
int m_x;
friend int main();
};
class FT2 : public FT
{
private:
int m_y;
};
int main()
{
FT2 ft2;
ft2.m_x = 555; //Ok: 'FT::m_x' is private and 'main' is friend of 'FT'
ft2.m_y = 777; //error: 'FT2::m_y' is private and 'main' is not friend of 'FT2'
}
R>"Дружба не наследуется" нужно понимать так, что друзья базового класса не являются автоматически друзьями производных. В приведенном тобой примере друг базового класса получает доступ к закрытому члену базового же класса, так что все правильно. Доступ же к закрытым членам производного класса закрыт для друга базового...
Наверное, лучше это всё же описывается в терминах наследования реализации/наследования интерфейса. Тогда это не похоже на какую-то дыру
Здравствуйте, blacksun, Вы писали:
B>Задали вопрос на собеседовании, я до сих пор в сомнениях. Ответил что все наследуется, хотя сейчас сомнительно насчет недефолтовых конструкторов.
А не следует ли на такой вопрос отвечать вопросом: What's In Class?
а помоему это идиотский вопрос можно хорошего кандидата отсеять
а какого нибудь зубрилку ботаника взять
я бы просил написать код основных структур данных списки деревья плюс
по специальности если он tcp/ip кодер то написать сервер клиент с определенными
тех требованиями к нагрузке и смотрел бы на качество кода на стиль
на поведение интересный человек увлечен своим делом или нет спросил бы есть
ли у него свои проекты чтоб показал мне же с ним работать придется
а спрашивать такую ересь чистой воды бредятина ну знает он и что
тот кто не знает прочитает и через пять минут тоже будет знать
вообще не показатель этот вопрос
On 11.06.2011 0:40, blacksun wrote:
> Задали вопрос на собеседовании, я до сих пор в сомнениях. Ответил что все > наследуется, хотя сейчас сомнительно насчет недефолтовых конструкторов.
On 11.06.2011 1:49, rg45 wrote:
> > Ну, во-первых, не наследуются функции-члены, автоматически генерируемые > компилятором: копирующий оператор присваивания и деструктор; а во-вторых, не > наследуются конструкторы, причем, не только автоматически генерируемые — > копирующий и по умолчанию — а, наверное, можно сказать, что все.
Да просто ВСЕ конструкторы и деструктор. И оператор присваивания.
Не важно, как они сделаны, автоматически или вручную.
Здравствуйте, rg45, Вы писали:
R>... а во-вторых, не наследуются конструкторы, причем, не только автоматически генерируемые — копирующий и по умолчанию — а, наверное, можно сказать, что все.
В C++0x конструкторы могут наследоваться (подробнее здесь, или 12.9 в драфте), хотя уже поступают предложения об удалении этой возможности.
Юрий Жмеренецкий:
ЮЖ>В C++0x конструкторы могут наследоваться (подробнее здесь, или 12.9 в драфте), хотя уже поступают предложения об удалении этой возможности.
Здравствуйте, MasterZiv, Вы писали:
MZ>On 11.06.2011 0:40, blacksun wrote:
>> Задали вопрос на собеседовании, я до сих пор в сомнениях. Ответил что все >> наследуется, хотя сейчас сомнительно насчет недефолтовых конструкторов.
MZ>Конструкторы, деструктор, оператор присваивания.
Конструкторы, деструкторы, оператор присваивания и друзья.