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

Выполнение чистых виртуальных функции - C++

Восстановить пароль Регистрация
 
bearwoolfs
 Аватар для bearwoolfs
15 / 15 / 2
Регистрация: 10.01.2011
Сообщений: 275
20.10.2011, 10:26     Выполнение чистых виртуальных функции #1
Программа выдает ошибку в строке 50-51-51 переопределены различные базовые типы ??? Помогите пожалуйста разобраться задачей

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
#include<iostream>
using namespace std;
 
class Shape
{
public:
    Shape(){}// объявляю конструктор по умолчанию
    virtual ~Shape(){}// виртуальный диструктор
    virtual long GetArea()=0;
    virtual long GetPerim()=0;
    virtual void Draw()=0;
private:
};
 void Shape::Draw()
{
    cout<<"Abstract drawning mechanism"<<endl;
}
class Circle:public Shape
{
public:
    Circle(int radius):itsRadius(radius){}
    virtual ~Circle(){}
    long GetArea(){return 3*itsRadius*itsRadius;}
    long GetPerim(){return 9*itsRadius;}
    virtual void Draw();
private:
    int itsRadius;
    int itsCircumference;
};
void Circle::Draw()
{
    cout<<"Circle drawning routine here"<<endl;
    Shape::Draw();
}
class Rectangle:public Shape
{
public:
    Rectangle(int len,int width):
      itsLenght(len),itsWidth(width){}
      virtual ~Rectangle(){}
      long GetArea(){return itsLenght*itsWidth;}
      long GetPerim(){return 2*itsLenght+2*itsWidth;}
      virtual int GetLenght(){return itsLenght;}
      virtual int GetWidth(){return itsWidth;}
      virtual void Draw();
private:
    int itsWidth;
    int itsLenght;
}
void Rectangle::Draw()
{
    for (int i=0;i<itsLenght;i++)
    {
        for (int j=0;j<itsWidth;j++)
            cout<<"x"<<endl;
    }
    Shape::Draw();
}
class Square:public Rectangle
{
public:
    Square(int len);
    Square(int len,int width);
virtual ~Square(){}
long GetPerim(){return 4 * GetLenght();}
};
Square::Square(int len):Rectangle(len,len)
{}
Square::Square(int len,int width):Rectangle(len,width)
{
    if(GetLenght()!=GetWidth())
        cout<<"Eror,not Square"<<endl;
}
 
int main()
{
    int choice;
    bool fQuit=false;
    Shape * sp;
 
    while(1)
    {
    cout<<"1circle 2rectangle 3square 0quit"<<endl;
    cin>>choice;
 
    switch (choice)
    {
    case 1: sp=new Circle(5);
        break;
    case 2: sp=new Rectangle(4,6);
        break;
    case 3: sp=new Square(5);
        break;
    default: fQuit=true;
        break;
    }
    if (fQuit)
        break;
 
    sp->Draw();
    delete sp;
    cout<<""<<endl;
    }
    return 0;
}
Добавлено через 11 минут
Попытался реализовать более маленький код чистых виртуальных функций
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
#include <iostream>
using namespace std;
 
class Number
{
public:
    virtual void Metod()=0;
};
void Number::Metod()
{
    cout<<"Metod Number"<<endl;
}
class One
{
public:
     void Draw();
};
void One::Draw()
{
    cout<<"Metod One"<<endl;
    Number::Metod();// нестатическая ссылка не член должна указыать относительно заданного объекта???? что это ???
}
 
int main()
{
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
20.10.2011, 10:43     Выполнение чистых виртуальных функции #2
строка 49 - забыл ;

Добавлено через 2 минуты
второй пример - создай объект или унаследуйся
bearwoolfs
 Аватар для bearwoolfs
15 / 15 / 2
Регистрация: 10.01.2011
Сообщений: 275
20.10.2011, 11:05  [ТС]     Выполнение чистых виртуальных функции #3
Цитата Сообщение от PointsEqual Посмотреть сообщение
строка 49 - забыл ;


Добавлено через 2 минуты
второй пример - создай объект или унаследуйся
А где ег осоздать в классе или в функции Metod ???

Добавлено через 2 минуты
Да такую банальную вещь забыл )
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
20.10.2011, 11:09     Выполнение чистых виртуальных функции #4
Цитата Сообщение от bearwoolfs Посмотреть сообщение
А где ег осоздать в классе или в функции Metod ???
не получится этот вариант. Наследуйся. Ведь не просто же так ты сделал класс абстрактным
Виктор_Сен
 Аватар для Виктор_Сен
30 / 23 / 1
Регистрация: 01.08.2011
Сообщений: 176
20.10.2011, 12:19     Выполнение чистых виртуальных функции #5
Цитата Сообщение от bearwoolfs Посмотреть сообщение
Программа выдает ошибку в строке 50-51-51
Дело в том, что у тебя определён чисто виртуальный метод, чего быть не должно. То есть если ты пишешь
C++
1
virtual void Draw()=0;
, то вот такого быть не должно:
C++
1
2
3
4
5
void Circle::Draw()
{
        cout<<"Circle drawning routine here"<<endl;
        Shape::Draw();
}
на то он и чисто виртуальный. Так прокатит, если "=0" убрать. А если нет, то определять его можно только в дочернем классе.
bearwoolfs
 Аватар для bearwoolfs
15 / 15 / 2
Регистрация: 10.01.2011
Сообщений: 275
20.10.2011, 12:36  [ТС]     Выполнение чистых виртуальных функции #6
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Дело в том, что у тебя определён чисто виртуальный метод, чего быть не должно. То есть если ты пишешь
C++
1
virtual void Draw()=0;
, то вот такого быть не должно:
C++
1
2
3
4
5
void Circle::Draw()
{
        cout<<"Circle drawning routine here"<<endl;
        Shape::Draw();
}
на то он и чисто виртуальный. Так прокатит, если "=0" убрать. А если нет, то определять его можно только в дочернем классе.
Абсолютно нормально работает , абстрактный класс замещается в трех производных от него

вот маленький пример , тут все видно. ПО типу создания окна в Windows если кликаешь на дачернюю папку то он просто замещает ее.
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
#include <iostream>
using namespace std;
 
class Number
{
public:
    Number(){}
    virtual ~Number(){}
    virtual void Metod()=0;
private:
};
void Number::Metod()
{
    cout<<"Metod Number"<<endl;
}
class One:public Number
{
public:
    One(int A){}
    virtual~One(){}
    virtual void Metod();
private:
    int itsA;
};
void One::Metod()
{
    cout<<"Metod One"<<endl;
    Number::Metod();
}
 
int main()
{
    Number *pN;
    pN=new One(5);
    pN->Metod();
    delete pN;
return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от PointsEqual Посмотреть сообщение
не получится этот вариант. Наследуйся. Ведь не просто же так ты сделал класс абстрактным
Теперь все понятно , абстрактные методы не зря разместили в одном разделе с Наследованием))) Дошло хоть и с 30 раза . Спасибо
Yandex
Объявления
20.10.2011, 12:36     Выполнение чистых виртуальных функции
Ответ Создать тему
Опции темы

Текущее время: 05:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru