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

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

Войти
Регистрация
Восстановить пароль
 
Alukar
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 6
#1

Наследование, абстрактные классы. - C++

24.10.2010, 17:33. Просмотров 940. Ответов 4
Метки нет (Все метки)

Собственно нужно создать абстрактный базовый класс Shape, от него наследовать абстрактные классы Shape2D и Shape3D. От них конкретные классы для вычисления объёма и площади. Треугольник, прямоугольник круг в 2Д. Цилиндр, куб, сфера для 3Д.
пишу на вижуале 2008.

//Header1.h
Код
#include "stdafx.h"

class Shape   // базовый класс
{
public:
	virtual double getS()=0;
	virtual void Set()=0;
	virtual void print()=0;
};
class Shape2D: public Shape    // для 2Д фигур 
{

};
class rectangle: public Shape2D // прямоугольник
{
private:
	int a,b;
	double s;
public:
	rectangle(int=0,int=0);
	double getS();
	void Set(int,int);
	void print();
	~rectangle();
};
class circle: public Shape2D   // круг
{
private:
	int r;
	double s;
public:
	circle(int=0);
	double getS();
	void Set(int);
	void print();
	~circle();
};
class triangle: public Shape2D //треугольник
{ 
private:
	int a,b,c;
	double s;
public:
	triangle(int=0,int=0,int=0);
	double getS();
	void Set(int,int,int);
	void print();
	~triangle();
};
class Shape3D: public Shape  // для 3Д
{
public:
	//virtual void print()=0;
	virtual double getV()=0;
	//virtual double getS()=0;
	//virtual void Set()=0;
};
class cylinder: public Shape3D //цилиндр
{
private:
	int r,h;
	double s,v;
public:
	cylinder(int=0,int=0);
	double getV(); // получить объём
	double getS(); // получить прощадь
	void Set(int,int); // задать фигуру
	void print();
	~cylinder();
};
class cube: public Shape3D // куб
{
private:
	int a;
	double s,v;
public:
	cube(int=0);
	double getV(); // получить объём
	double getS(); // получить прощадь
	void Set(int);
	void print();
	~cube();
};
class sphere: public Shape3D // сфера
{
private:
	int r;
	double s,v;
public:
	sphere(int=0);
	double getV(); // получить объём
	double getS(); // получить прощадь
	void Set(int);
	void print();
	~sphere();
};
// source.cpp
Код
#include "stdafx.h"
#include "Header1.h"
#include <iostream>
#include "math.h"
using namespace std;

rectangle::rectangle(int va,int vb)
{
	a=va;
	b=vb;
	s=a*b;
}
double rectangle::getS()
{
	return s;
}
void rectangle::Set(int va,int vb)
{
	a=va;
	b=vb;
	s=a*b;
}
rectangle::~rectangle()
{
}
void rectangle::print()
{
	cout<<"a: "<<a<<endl<<"b: "<<b<<endl;
}

circle::circle(int vr)
{
	r=vr;
	s=3.14*r*r;
}
double circle::getS()
{
	return s;
}
void circle::Set(int vr)
{
	r=vr;
	s=3.14*r*r;
}
void circle::print()
{
	cout<<"R: "<<r<<endl;
}
circle::~circle()
{
}

triangle::triangle(int va, int vb, int vc)
{
	a=va;
	b=vb;
	c=vc;
	double p=(a+b+c)/2;
	s=sqrt(p*(p-a)*(p-b)*(p-c));
}
double triangle::getS()
{
	return s;
}
void triangle::print()
{
	cout<<"a: "<<a<<endl<<"b: "<<b<<endl<<"c: "<<c<<endl;
}
void triangle::Set(int va, int vb, int vc)
{
	a=va;
	b=vb;
	c=vc;
	double p=(a+b+c)/2;
	s=sqrt(p*(p-a)*(p-b)*(p-c));
}

triangle::~triangle()
{
}

cylinder::cylinder (int vr, int vh)
{
	r=vr;
	h=vh;
	s=2*(3.14*r*r)+6.28*r*h;
	v=3.14*r*r*h;
}

double cylinder::getS()
{
	return s;
}

double cylinder::getV()
{
	return v;
}

void cylinder::Set(int vr, int vh)
{
	r=vr;
	h=vh;
	s=2*(3.14*r*r)+6.28*r*h;
	v=3.14*r*r*h;
}

void cylinder::print()
{
	cout<<"r: "<<r<<endl<<"h: "<<h<<endl;
}

cube::cube (int va)
{
	a=va;
	s=6*a*a;
	v=a*a*a;
}

void cube::Set(int va)
{
	a=va;
	s=6*a*a;
	v=a*a*a;
}

double cube::getS()
{
	return s;
}

double cube::getV()
{
	return v;
}

void cube::print()
{
	cout<<"a: "<<a<<endl;
}

sphere::sphere (int vr)
{
	r=vr;
	s=4*3.14*r*r;
	v=(4*3.14*r*r*r)/3;
}

void sphere::Set(int vr)
{
	r=vr;
	s=4*3.14*r*r;
	v=(4*3.14*r*r*r)/3;
}

double sphere::getS()
{
	return s;
}

double sphere::getV()
{
	return v;
}

void sphere::print()
{
	cout<<"r: "<<r<<endl;
}
выдаёт кучу ошибок, по идее не правильно наследую что-то, пишет что перераспределяю классы...

Добавлено через 15 минут
Ну и main пустой пока что.

Код
#include "stdafx.h"
#include "Header1.h"
#include "source.cpp"
#include <iostream>
#include "math.h"

using namespace std;

void main()
{
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2010, 17:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование, абстрактные классы. (C++):

Абстрактные классы. Наследование - C++
Здравствуйте! Препод дал задание на наследование и абстрактные классы. Кому не трудно, посмотрите, пожалуйста код, правильно ли я делаю? ...

Наследование и абстрактные классы - C++
расскажите что это и с чем это едят......... а то как то встал на этом!!!

Абстрактные классы, наследование - C++
Задание: Написать базовый абстрактный класс «фигура» (с чистыми виртуальными функциями: нарисовать, передвинуть, повернуть) и два класса...

Наследование: Чистые Виртуальные функции и Абстрактные классы - C++
Добрый вечер помогите пожалуйста вывести на экран то что мы вводим с клавиатуры ( int s , char d ) #include &quot;stdafx.h&quot; ...

Абстрактные классы - C++
Объясните пожалуйста почему это не работает и как исправить? cannot declare variable 'b1' to be of abstract type 'classB' because the...

Абстрактные классы - C++
Ребята! Помогите с таким делом. Мне дали задание создать абстрактный класс Автомобиль, классы наследники: гоночный автомобиль, асфальтный...

4
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
24.10.2010, 17:39 #2
Alukar, Гм. Круг у вас абстрактный остается. Да и остальные похоже. Потому как вы создаете новые функции, а не переопределяете абстрактные наследка.
C++
1
        virtual void Set()=0;
в Shape

C++
1
        void Set(int,int);
в Rectangle
C++
1
        void Set(int);
в Circle
C++
1
        void Set(int,int,int);
в Triangle
C++
1
        void Set(int,int); // задать фигуру
в Cilindre

И так далее. Итог: все классы у вас абстрактные.
0
Alukar
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 6
24.10.2010, 18:22  [ТС] #3
C++
1
2
3
4
5
6
void cube::Set(int va)
{
        a=va;
        s=6*a*a;
        v=a*a*a;
}
Я же вот тут наново описываю функцию. Чтобы сделать класс конкретным. Почему это считается как создание новой функции? Мне пишет что я перераспределяю class Shape, Shape2D и остальные
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
24.10.2010, 18:25 #4
Alukar, Господи. Потому что в базовом классе Shape функция Set не имеет ни одного параметра, как вы сами я думаю заметили. А в остальных местах - имеет. Вот и результат.
Хотя если main пустой... Возможно стоит поставить страж включения. Но то, что классы абстрактные - 100%
0
Alukar
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 6
24.10.2010, 20:24  [ТС] #5
Разобрался, спасибо.
0
24.10.2010, 20:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2010, 20:24
Привет! Вот еще темы с ответами:

Абстрактные классы - C++
Помогите плиз, экзаменационное задание, а разобраться не могу с ним: Создать консольное приложение, в котором реализовать работу...

Абстрактные классы - C++
Помогите пожалуйста, сообразить не могу. Есть абстрактный класс. У него есть метод, чтение из файла. Есть производный от него класс....

абстрактные классы - C++
Здрасте я при написании программы столкнулся с проблемой что немогу создать указатель на объект т.к. класс абстрактный прошу помогите...

Абстрактные классы - C++
Народ, вопрос есть такой. Есть абстрактный класс class A { protected: int a; public: A(int b=0):a(b) {


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

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

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