Форум программистов, компьютерный форум CyberForum.ru

Указатель на базовый класс и на производный - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ error LNK2001: unresolved external symbol http://www.cyberforum.ru/cpp-beginners/thread924615.html
Здравствуйте. Начала изучать С++ по Либерти. На шаблонах компилятор начал выдавать ошибки. Вроде уже все 10 раз проверила. При комментировании строки в main() все работает, иначе: 1>19_4.obj : error LNK2001: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class...
C++ Вывести строку задом наперед 1)Пользователь вводит строку данных программа выводит из нее только цифры. 2)Вывести строку задам на перед. #include <iostream> #include <conio.h> using namespace std; int main { char name; http://www.cyberforum.ru/cpp-beginners/thread924602.html
C++ Помогите найти ошибку в коде
Всем привет.Пишу вот такой простенький код в Visual Studio #include <iostream> Int main() { system("pause");
Найти сумму элементов с нечетными индексами C++
как найти сумму елементов с непарными индексами
C++ можно ли инкрементировать в for на два. т.е. for(int i=0; i< N; i+2) http://www.cyberforum.ru/cpp-beginners/thread924579.html
ну конкретно так не получается, компилятор ругается, может как то по другому можно. Сейчас сделал так : for(int i=0; i< N; i++) { i++; ...... }
C++ Шаблон класса и дружественная функция Доброго времени суток. Столкнулся с непониманием одного процесса. Задача звучит следующим образом: Написать шаблон функции isEqualTo для сравнения 2-х параметров. Использовать эту функцию с объектом класса. Для этого нужно перегрузить оператор ==. Если я перегружаю оператор сравнения как элемент класса, работает нормально #include "stdafx.h" #include <iostream> using namespace std; ... подробнее

Показать сообщение отдельно
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345

Указатель на базовый класс и на производный - C++

17.07.2013, 15:38. Просмотров 705. Ответов 13
Метки (Все метки)

Пытаюсь разобраться с классами и наследованием.
Сама эта задача из Дейтела "Как программировать на C++"
Есть базовый класс Точка и у него один наследник Круг. В самой программе определяю две переменных у два указателя на эти классы.

Вообщем, если указателю на производный класс присвоить указатель на базовый, то странный вывод. Печатает что радиус равен 0 (я в комментарии показал вывод программы)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "iostream"
#include "iomanip"
 
class CPoint
{
    friend std::ostream &operator<<(std::ostream &out, const CPoint &point);
 
public:
    CPoint(double x=0.0, double y=0.0);
    void SetPoint(double x, double y);
 
protected:
    double mX, mY;
};
 
class CCircle : public CPoint
{
    friend std::ostream &operator<<(std::ostream &out, const CCircle &circle);
 
public:
    CCircle(double x=0.0, double y=0.0, double radius=1.0);
    void SetRadius(double radius);
 
protected:
    double mRadius;
};
 
 
 
 
 // CPoint
CPoint::CPoint(double x, double y)          { SetPoint(x, y); }
 
void CPoint::SetPoint(double x, double y)   { mX=x;  mY=y; }
 
std::ostream &operator<<(std::ostream &out, const CPoint &point)
{
    std::streamsize prec = std::cout.precision();
    out << "[" << std::fixed << std::setprecision(2) << point.mX << ", " << point.mY << "]" << std::setprecision(prec);
    return out;
}
 
 
 
 
 
// CCircle
CCircle::CCircle(double x, double y, double radius)
    : CPoint(x, y)
{
    SetRadius(radius);
}
 
void CCircle::SetRadius(double radius)          { mRadius=(radius>0.0) ? radius : 1.0; }
 
std::ostream &operator<<(std::ostream &out, const CCircle &circle)
{
    std::streamsize prec = std::cout.precision();
    out << "Центр = [" << std::fixed << std::setprecision(2) << circle.mX << ", " << circle.mY << "]; Радиус = " << circle.mRadius << std::setprecision(prec);
    return out;
}
 
 
 
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    CPoint      point(1.1, 2.2),  *ptrPoint;
    CCircle     circle(5.5, 6.6, 10.0),  *ptrCircle;
 
    ptrPoint=&point;
    ptrCircle=(CCircle *)ptrPoint;
    std::cout << "*ptrPoint:  " << *ptrPoint << std::endl;      // *ptrPoint:  [1.10, 2.20]
    std::cout << "*ptrCircle: " << *ptrCircle << std::endl;     // *ptrCircle: Центр = [1.10, 2.20]; Радиус = 0.00
 
    system("pause");
    return 0;
}

Почему второй вывод печатает Радиус = 0.00 ? Почему не мусор? Ведь у точки нет радиуса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru