0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 4
1

Отрабатывает оператор базового, а не производного класса

30.05.2017, 23:45. Показов 441. Ответов 2
Метки нет (Все метки)

Здравствуйте! Собственно, вопрос в следующем. Я перегрузил оператор потокового вывода для базового и для производного класса. При выводе объектов через поток, как написано в коде, явно отрабатывает оператор вывода базового класса, так как поля производного класса не выводятся. При этом метод производного класса работает и меняет значение nr. Как с помощью такого способа вывода заставить работать оператор вывода производного класса? Если несложно, объясните, как различать, когда какой класс вызывается при работе с указателями как в коде или дайте толковую ссылку. Заранее благодарен.

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
83
84
85
86
#include <iostream>
using namespace std;
 
class Norm{
protected:
double nr, md;
public:
    Norm();
    Norm(double,double);
    Norm(const Norm&);
    virtual~Norm();
    Norm &operator=(const Norm&);
    friend ostream &operator<<(ostream&, const Norm&);
    virtual void norme()=0;
    //virtual void modal()=0;
};
 
Norm::Norm():nr(0.0),md(0.0){
cout<<"silent constructor"<<endl;
};
 
Norm::Norm(double nnr,double mmd):nr(nnr),md(mmd){
cout<<"Noize constructor"<<endl;
};
 
Norm::Norm(const Norm &src):nr(src.nr),md(src.md){};
 
Norm::~Norm(){};
 
ostream &operator<<(ostream& os,const Norm& src){
    os<<src.nr<<", "<<src.md;
return os;
};
 
Norm &Norm::operator =(const Norm &src){
    if(this==&src){return *this;}
nr=src.nr;
md=src.md;
return *this;
};
 
class Complex:public Norm{
private:
double x,y;
public:
    Complex();
    Complex(double,double);
    Complex(const Complex&);
    ~Complex();
    Complex &operator=(const Complex&);
    friend ostream &operator<<(ostream&, const Complex&);
    void norme();
    //void modal();
};
 
Complex::Complex():Norm(),x(0.0),y(0.0){};
Complex::Complex(double xx,double yy):Norm(),x(xx),y(yy){};
Complex::Complex(const Complex &src):Norm((const Norm&)src), x(src.x),y(src.y){};
Complex::~Complex(){};
Complex &Complex::operator =(const Complex &src){
    if(this==&src){return *this;}
    Norm::operator= ((const Norm &) src);
    x = src.x; y = src.y;
    return *this;
};
ostream &operator<< (ostream &os, const Complex &src) {
    os << (const Norm &) src << ", " << src.x << ", " << src.y;
    return os;
};
 
void Complex::norme(){
nr=x+y;
};
 
int main(){
 
    Complex robby(3.4,5.6),roddy(6.7,8.4);
    Norm *p1 =new Complex (3.4,5.6);
    cout<<*p1<<endl;
    Norm *p2 =new Complex (6.7,8.4);
    cout<<*p2<<endl;
    p1->norme();
    cout<<*p1<<endl;
    system("pause");
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2017, 23:45
Ответы с готовыми решениями:

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его...

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp,...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект...

Создать объект производного класса с передачей параметров в конструктор базового класса
Доброго времени суток! Если не затруднит, утолите мой интерес, пожалуйста! Есть базовый и...

2
зомбяк
1562 / 1211 / 344
Регистрация: 14.05.2017
Сообщений: 3,925
31.05.2017, 00:14 2
Цитата Сообщение от Bleffy Посмотреть сообщение
когда какой класс вызывается при работе с указателями как в коде
в коде, судя по
C++
1
 cout<<*p1<<endl;
не указатели, а уже объекты (разыменованные указатели). Приводи указатели к нужному классу, например так
C++
1
 cout<<*(static_cast<Complex *>(p1))<<endl;
Если же требуется, чтоб всё работало автоматически, то ostream &operator<<(ostream& os,const Norm& src) должен вызывать некую виртуальную функцию класса Norm, которая бы и проводила операции с ostream. А простое переопределение для производного класса потребует преобразования указателя к указателю на производный...
0
2548 / 1207 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
31.05.2017, 00:29 3
Bleffy,

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
using namespace std;
 
class Norm
{
protected:
    double nr, md;  
 
public:
    Norm();
    Norm( double, double );
    Norm( const Norm& );
    virtual~Norm();
    Norm &operator=( const Norm& );
    friend ostream &operator<<( ostream&, const Norm& );
    virtual void norme() = 0;
    virtual void print( ostream& os ) const;
    //virtual void modal()=0;
};
 
void Norm::print( ostream& os) const
{   
    os << nr << ", " << md; 
}
 
Norm::Norm() :nr( 0.0 ), md( 0.0 )
{
    cout << "silent constructor" << endl;
};
 
Norm::Norm( double nnr, double mmd ) :nr( nnr ), md( mmd )
{
    cout << "Noize constructor" << endl;
};
 
Norm::Norm( const Norm &src ) :nr( src.nr ), md( src.md )
{
};
 
Norm::~Norm()
{
};
 
ostream &operator<<( ostream& os, const Norm& src )
{
    src.print( os );
    return os;
};
 
Norm &Norm::operator =( const Norm &src )
{
    if( this == &src )
    {
        return *this;
    }
    nr = src.nr;
    md = src.md;
    return *this;
};
 
class Complex :public Norm
{
private:
    double x, y;
public:
    Complex();
    Complex( double, double );
    Complex( const Complex& );
    ~Complex();
    Complex &operator=( const Complex& );
    friend ostream &operator<<( ostream&, const Complex& );
    void norme();
    virtual void print( ostream& os ) const override;
 
};
 
Complex::Complex() :Norm(), x( 0.0 ), y( 0.0 )
{
};
Complex::Complex( double xx, double yy ) :Norm(), x( xx ), y( yy )
{
};
Complex::Complex( const Complex &src ) :Norm( ( const Norm& )src ), x( src.x ), y( src.y )
{
};
Complex::~Complex()
{
};
Complex &Complex::operator =( const Complex &src )
{
    if( this == &src )
    {
        return *this;
    }
    Norm::operator= ( ( const Norm & )src );
    x = src.x; y = src.y;
    return *this;
};
ostream &operator<< ( ostream &os, const Complex &src )
{
    src.print( os );
    return os;
};
 
void Complex::norme()
{
    nr = x + y;
}
void Complex::print( ostream & os ) const
{
    Norm::print( os );
    os <<  ", " << x << ", " << y;
}
;
 
int main()
{
 
    Complex robby( 3.4, 5.6 ), roddy( 6.7, 8.4 );
    Norm *p1 = new Complex( 3.4, 5.6 );
    cout << *p1 << endl;
    Norm *p2 = new Complex( 6.7, 8.4 );
    cout << *p2 << endl;
    p1->norme();
    cout << *p1 << endl;
    system( "pause" );
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2017, 00:29
Помогаю со студенческими работами здесь

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний...

Возможно ли указатель производного класса инициализировать объектом базового класса?
имеется связка наследуемых классов A-&gt;B а от B наследуются одновременно еще два класса B-&gt;C и B-&gt;D...

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса -...

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; }...

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса
Класс В является производным от класса А. Определить обработчик исключительной ситуации на...

Что происходит когда передается в функцию базового класса аргумент с типом производного класса?
Есть функция перегруженного оператора&quot;+&quot; в производном классе и в базовом классе который принимает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru