Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9

Наследование c++

24.02.2017, 20:30. Показов 4327. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Есть абстрактный класс :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class GeometryFigures
{
private:
    string Name;
public:
    void setName(string Name_new);
    string getName() const;
    virtual double calculateArea() const = 0;
    virtual double calculatePerimeter() const = 0;
    virtual void Show() const = 0;
};
 
void GeometryFigures::setName(string Name_new)
{
    Name = Name_new;
}
 
string GeometryFigures::getName() const
{
    return Name;
}
От которого наследуется класс Прямоугольник
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
// прямоугольник
class Rectangle : public GeometryFigures
{
private:
    double a, b;
public:
    Rectangle();
    Rectangle(double a_new, double b_new);
    void setA(double a_new);
    void setB(double b_new);
    virtual double calculateArea() const;
    virtual double calculatePerimeter() const;
    virtual void Show() const;
};
 
Rectangle::Rectangle()
{
    setName("Rectangle");
    a = 0;
    b = 0;
}
 
Rectangle::Rectangle(double a_new, double b_new)
{
    setName("Rectangle");
    a = a_new;
    b = b_new;
}
 
void Rectangle::setA(double a_new)
{
    a = a_new;
}
 
void Rectangle::setB(double b_new)
{
    b = b_new;
}
 
double Rectangle::calculateArea() const
{
    return a * b;
}
 
double Rectangle::calculatePerimeter() const
{
    return 2 * (a + b);
}
 
void Rectangle::Show() const
{
    cout << getName() << " : A = " << a << "; B = " << b
        << "; Area = " << calculateArea() << " ; Perimeter = " << calculatePerimeter() << endl;
}
А от класса Прямоугольник наследуется класс Квадрат
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// квадрат - частный случай прямоугольника
class Square : public Rectangle
{
public:
    Square();
    Square(double a_new);
};
 
Square::Square()
{
    setName("Square");
    Rectangle::setA(0);
    Rectangle::setB(0);
}
 
Square::Square(double a_new)
{
    setName("Square");
    Rectangle::setA(a_new);
    Rectangle::setB(a_new);
}
И главная программа
C++
1
2
3
4
5
6
7
8
9
10
11
12
int _tmain(int argc, _TCHAR* argv[])
{
    GeometryFigures *mass[2];
    mass[0] = new Square(10);
    mass[1] = new Rectangle(10, 15);
    for (int i = 0; i < 2; i++)
        mass[i]->Show();
    for (int i = 0; i < 2; i++)
        delete mass[i];
    _getch();
    return 0;
}
Собственно вопрос:
как мне вызвать метод setA дочернего класса Прямоугольник? Нужно поменять одну сторону, но этого сделать не получается...
Спасибо за внимание.
P.S. от базового класса наследуются ещё два класса : Треугольник и Круг.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.02.2017, 20:30
Ответы с готовыми решениями:

Заменить наследование классов на наследование интерфейсов
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование
Не могу понять в чем ошибка. #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class Auto { protected: string...

Наследование?!
привет всем. Есть класс Circle c1, c2, c3 Нужно реализовать через наследование класс множество, прошу помочь как он будет выглядеть...

16
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.02.2017, 20:35
Приведи тип - dynamic_cast.
1
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
24.02.2017, 20:39
C++
1
2
3
if(dynamic_cast<Rectangle*>(mass[1])){
    static_cast<Rectangle*>(mass[1])->setA(10);
}
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.02.2017, 20:43  [ТС]
Заработало. Упс...уже ответили
C++
1
dynamic_cast<Rectangle*>(mass[1])->setA(15);
Ещё вопрос: правильно ли я унаследовал класс Квадрат?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.02.2017, 20:57
Как-то ты по-древнему пишешь. Так обычно делают:
C++
1
Rectangle::Rectangle(): Name("Rectangle"), a(0), b(0) {}
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.02.2017, 21:03  [ТС]
nmcf, так я потом объявление классов хочу в заголовочный файл закинуть .h,а реализацию в .cpp.
В данном случае, разве такая конструкция подойдет?
C++
1
Rectangle::Rectangle(): Name("Rectangle"), a(0), b(0) {}
Или мне уже пора вылазить из свой пещеры и начинать образовываться?
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
24.02.2017, 21:18
Gdasar, в данном случае уже и есть реализация конструктора
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.02.2017, 21:25
Это и будет в cpp.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.02.2017, 21:26  [ТС]
Peoples, так я знаю, что это реализация. Я хочу вынести все реализации в файл .cpp.
Но данный случай работать будет только в самом классе, но не в файле .cpp.
Или я чего-то не понимаю?
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
24.02.2017, 21:27
Gdasar,
Цитата Сообщение от nmcf Посмотреть сообщение
Это и будет в cpp.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.02.2017, 21:39  [ТС]
Peoples, подарочек от компилятора подъехал:
Ошибка 1 error C2084: функция "Rectangle::Rectangle(void)" уже имеет текст реализации c:\users\gdasar\desktop\testtask\console application1\consoleapplication1\console application1.cpp 124 1 ConsoleApplication1

Ошибка 2 error C2614: Rectangle: недопустимая инициализация члена: "Name" не является базовым классом или членом c:\users\gdasar\desktop\testtask\console application1\consoleapplication1\console application1.cpp 124 1 ConsoleApplication1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Rectangle : public GeometryFigures
{
private:
    double a, b;
public:
    Rectangle();
    //Rectangle(double a_new, double b_new);
    void setA(double a_new);
    void setB(double b_new);
    virtual double calculateArea() const;
    virtual double calculatePerimeter() const;
    virtual void Show() const;
};
 
Rectangle::Rectangle() : Name("Rectangle"), a(0), b(0) {}
Добавлено через 2 минуты
Тьфу ты. Попутал

Добавлено через 2 минуты
Ну, типо того
Ошибка 1 error C2614: Rectangle: недопустимая инициализация члена: "Name" не является базовым классом или членом c:\users\gdasar\desktop\testtask\console application1\consoleapplication1\console application1.cpp 124 1 ConsoleApplication1

2 IntelliSense: член "GeometryFigures::Name" (объявлено в строке 17) недоступно c:\Users\GdasaR\Desktop\TestTask\Console Application1\ConsoleApplication1\Console Application1.cpp 124 26 ConsoleApplication1
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
24.02.2017, 21:40
C++
1
2
3
4
5
class GeometryFigures
{
protected:  // тут
    string Name;
...
или создавайте сеттер, типо
C++
1
2
3
void setName(string &s){
name=s;
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.02.2017, 21:40
Name перенеси в секцию protected.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.02.2017, 21:46  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
class GeometryFigures
{
public:
    void setName(string Name_new);
    string getName() const;
    virtual double calculateArea() const = 0;
    virtual double calculatePerimeter() const = 0;
    virtual void Show() const = 0;
protected:
    string Name;
};
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
class Rectangle : public GeometryFigures
{
private:
    double a, b;
public:
    Rectangle();
    Rectangle(double a_new, double b_new);
    void setA(double a_new);
    void setB(double b_new);
    virtual double calculateArea() const;
    virtual double calculatePerimeter() const;
    virtual void Show() const;
};
 
/*Rectangle::Rectangle()
{
    setName("Rectangle");
    a = 0;
    b = 0;
}*/
 
Rectangle::Rectangle() : Name("Rectangle"), a(0), b(0) {}
 
Rectangle::Rectangle(double a_new, double b_new)
{
    setName("Rectangle");
    a = a_new;
    b = b_new;
}
Честное слово, делаю как вы пишите:
Ошибка 1 error C2614: Rectangle: недопустимая инициализация члена: "Name" не является базовым классом или членом c:\users\gdasar\desktop\testtask\console application1\consoleapplication1\console application1.cpp 124 1 ConsoleApplication1

2 IntelliSense: "Name" не является нестатическим элементом данных или базовым классом для класса "Rectangle" c:\Users\GdasaR\Desktop\TestTask\Console Application1\ConsoleApplication1\Console Application1.cpp 124 26 ConsoleApplication1
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.02.2017, 22:03
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class GeometryFigures
{
 
//...
 
protected:
    string Name;
    GeometryFigures(const string &N): Name(N) {}
};
 
class Rectangle : public GeometryFigures
{
private:
    double a, b;
public:
 
//...
 
    Rectangle();
};
 
Rectangle::Rectangle(): GeometryFigures("Rectangle"), a(0), b(0) {}
1
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
24.02.2017, 22:13  [ТС]
Кстати, а вот тут
C++
1
2
3
4
5
6
Square::Square()
{
    setName("Square");
    Rectangle::setA(0);
    Rectangle::setB(0);
}
ничего криминального нет в задании значений?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.02.2017, 22:48
Работать будет и так, но делают конструкторы обычно как я показал.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.02.2017, 22:48
Помогаю со студенческими работами здесь

наследование
Пытаюсь разобраться в наследовании Есть класс class File { public: struct comp { char num; // Имя переменной char st;...

Наследование
На языке С++ описать модель данных для вычисления площадей и периметров геометрических фигур на плоскости: треугольников и прямоугольников....

Наследование
Помогите решить вот такую задачку: Создать класс CFloatNumber, реализующий открытое наследование членов класса CIntNumber, содержащий...

наследование
Доброго времени суток всем. У меня такая проблема: написал класс L2 список символов. На его основе требуется сделать дек символов. Кроме...

наследование
Помогите разобраться в программе. Почему возникают такие ошибки cylindr.cpp expected `,' or `...' before '&amp;' token cylindr.cpp `c'...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru