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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование дружественных функц. при наследовани 
:(
    Опции темы
yngwie19
Дата 21.4.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Здравствуйте. Есть такой пример простой иерархии наследования:
Код

#include "stdafx.h"

class Point
{
    friend ostream& operator<<(ostream&, const Point&);
    public:
        Point(float = 0.0, float = 0.0);
        float getX()const{return x;}
        float getY()const{return y;}
    protected:
        float x,y;
};
class Circle : public Point
{
    friend ostream& operator<<(ostream&,const Circle&);
    public:
        Circle(float = 0.0, float = 0.0, float = 0.0);
        float getRadius()const{return radius;}
    private:
        float radius;
};

int main()
{
    setlocale(LC_CTYPE, "Russian_Russia.1251");
    
    Point *pointPtr, p(3.5f,5.5f);
    Circle *circlePtr, c(10.0f, 4.4f,7.8f);
    
    return 0;
}
// Реализация класса Point
Point::Point(float x, float y)
{
    this->x = x;
    this->y = y;
}
// Реализация класса Circle
Circle::Circle(float r, float x, float y)
    : Point(x,y)
{
    this->radius = r;
}

// Реализация друзей классов Point и Circle
ostream& operator<<(ostream& out, const Point& p)
{
    out<<"Центр точки: ["<<p.x<<", "<<p.y<<"];";

    return out;
}
ostream& operator<<(ostream& out, const Circle& c)
{
    out<<(Point)c
        <<" радиус: "<<c.radius;

    return out;
}

Все работает замечательно, однако мне не понятно почему работает этот участок кода:
Код


    out<<(Point)c
        <<" радиус: "<<c.radius;

Откуда дружественная функция класса Circle знает про класс Point; т.е почему работает (Point)c ?

Это сообщение отредактировал(а) yngwie19 - 21.4.2010, 10:14
PM MAIL   Вверх
azesmcar
Дата 21.4.2010, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



yngwie19

Цитата(yngwie19 @  21.4.2010,  10:13 Найти цитируемый пост)
мне не понятно почему работает этот участок кода:

А почему он не должен работать? У тебя два оператора
Код

ostream& operator<<(ostream&, const Point&);
ostream& operator<<(ostream&,const Circle&);

во втором вызывается первый, все законно, в чем проблема?

Цитата(yngwie19 @  21.4.2010,  10:13 Найти цитируемый пост)
т.е почему работает (Point)c ?

облегчим задачу
Код

class Point
{
};
class Circle : public Point
{
};
int main()
{
    Circle p;
    Point q = p;
}

это понятно?
PM   Вверх
GrafF812
Дата 21.4.2010, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 3.12.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @  21.4.2010,  10:25 Найти цитируемый пост)
то понятно? 

Я понимаю как здесь происходит преобразование, мне не понятно откуда перегрузка оператора вывода для Circle знает о классе Point ?
PM MAIL   Вверх
azesmcar
Дата 21.4.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



yngwie19, 
GrafF812
???

Цитата(GrafF812 @  21.4.2010,  21:01 Найти цитируемый пост)
Я понимаю как здесь происходит преобразование, мне не понятно откуда перегрузка оператора вывода для Circle знает о классе Point ? 

Circle наследует Point, если знает о Circle - знает и о Point.

PM   Вверх
yngwie19
Дата 21.4.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



а мне не понятно было почему происходит преобразование  smile  Спасибо за помощь.
Цитата(azesmcar @  21.4.2010,  21:14 Найти цитируемый пост)
yngwie19, 
GrafF812
???

парнишка по ходу веткой ошибся! smile 
PM MAIL   Вверх
mes
Дата 22.4.2010, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(yngwie19 @  21.4.2010,  09:13 Найти цитируемый пост)
class Circle : public Point

Окружность есть точка , которая ..    хм, а я и не знал то  smile smile

Это сообщение отредактировал(а) mes - 22.4.2010, 08:38


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.