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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
bearwoolfs
15 / 15 / 1
Регистрация: 10.01.2011
Сообщений: 275
#1

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

20.10.2011, 10:26. Просмотров 483. Ответов 5
Метки нет (Все метки)

Программа выдает ошибку в строке 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2011, 10:26     Выполнение чистых виртуальных функции
Посмотрите здесь:

Реализация чистых виртуальных методов в производных классах - C++
Здравствуйте! Интересует такой вопрос: Допустим, имеется у нас базовый абстрактный класс и несколько производных от него классов. В...

Виртуальные функции, таблицы виртуальных методов, как они работают? - C++
подскажите пожалуйста,где лучше посмотреть про начинку виртуальных функций,т.е. про таблицы виртуальных методов и как они работают. Заранее...

Динамическая структура (СУБД на чистых c/c++, проблема занесения и чтения данных в таблицу) - C++
Доброго времени суток. Пишу СУБД на чистых c/c++ столкнулся с проблемой занесение и чтение данных в таблицу. Структура файла такая: ...

Выполнение перегрузки функции - C++
Нужно выполнить перегрузку функции: # include &lt;iostream.h&gt; # include &lt;conio.h&gt; # include &lt;math.h&gt; void func(int&amp;,int&amp;); ...

Можно ли замедлить выполнение функции? - C++
Передо мной стоит цель, сделать так, что бы объекты постоянно меняли свой цвет , но что бы это происходило не за доли секунды. Возможно ли...

Выполнение не той функции при наследовании - C++
#pragma hdrstop #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;tchar.h&gt; #include &lt;string&gt; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
20.10.2011, 10:43     Выполнение чистых виртуальных функции #2
строка 49 - забыл ;

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


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

Добавлено через 2 минуты
Да такую банальную вещь забыл )
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
20.10.2011, 11:09     Выполнение чистых виртуальных функции #4
Цитата Сообщение от bearwoolfs Посмотреть сообщение
А где ег осоздать в классе или в функции Metod ???
не получится этот вариант. Наследуйся. Ведь не просто же так ты сделал класс абстрактным
Виктор_Сен
33 / 26 / 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" убрать. А если нет, то определять его можно только в дочернем классе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2011, 12:36     Выполнение чистых виртуальных функции
Еще ссылки по теме:

Почему return не прерывает выполнение функции? - C++
Всем здрава! Чет я тут запутался слегонца. Есть функция: a = 1; b = 0; int pro() { if (a == 1){ if (b ==...

Выполнение функции в определенное системное время - C++
Привет. Как реализовать вызов функции, в строго определенные моменты времени? Конкретнее: вызывать функцию каждую секунду. Синхронно с...

Как запретить выполнение функции до её вызова в main? - C++
Подскажите: как запретить выполнение функции vvod до её вызова в main? #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; ...

По неизвестным причинам пропускается выполнение одной функции - C++
Привет всем ! У меня странная проблема, пропускается выполнение одной функции, а компилятор не выдает ошибок, почему так выходит ? ...


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

Или воспользуйтесь поиском по форуму:
bearwoolfs
15 / 15 / 1
Регистрация: 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     Выполнение чистых виртуальных функции
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru