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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.71
Domino's
0 / 0 / 0
Регистрация: 27.12.2009
Сообщений: 10
#1

абстрактный базовый класс - C++

01.03.2010, 23:57. Просмотров 4635. Ответов 6
Метки нет (Все метки)

Создать абстрактный базовый класс с виртуальной функцией – объем. Создать производные классы: параллелепипед, пирамида, шар со своими функциями объема. Для проверки определить массив ссылок на абстрактный класс, которым присваиваются адреса различных объектов. Объем параллелепипеда – v = xyz (x,y,z – стороны , пирамиды: v = xyh (x,y, – стороны, h – высота), шара: v = (4 пи * r^3 )/ 3
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2010, 23:57     абстрактный базовый класс
Посмотрите здесь:

Абстрактный базовый класс - C++
Привет всем! У меня есть абстрактный базовый класс Object.Он содержит различные методы. Например, virtual void...

Абстрактный базовый класс - C++
У меня имеется свой некоторый класс, для которого переопределена куча операций, в том числе и операторы + - * /, преподаватель дал задание...

Абстрактный базовый класс - C++
Создать абстрактный базовый класс с виртуальной функцией - объем. Создать производные классы: параллелепипед, пирамида, тетраэдр, шар со...

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

Создать абстрактный базовый класс - C++
Помогите: Создать абстрактный базовый класс Container с виртуальными функциями вставки и извлечения. Создать производные классы Stack и...

Абстрактный базовый класс(задача) - C++
Дано задание :Определите абстрактный базовый класс Person,содержащий поля "пол","возраст". Затем определите производный класс Student,...

Создать абстрактный базовый класс Vehicle - C++
Доброго всем дня! проблема в следующем - не могу понять условия задания. Мне главное что бы мне помогли сформировать условие задания. Вот...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
02.03.2010, 11:51     абстрактный базовый класс #2
Создать абстрактный базовый класс с виртуальной функцией – объем
C++
1
2
3
4
5
6
7
8
9
class base
{
public:
  virtual double func(int) = 0;
}
double base::func(int a)
{
  return a*a*a;
}
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
02.03.2010, 13:02     абстрактный базовый класс #3
Sekt:
Твой замысел мне не понятен, это я насчет чисто виртуальной функции.
И каким макаром её можно вызвать если объекты базового класса создавать нельзя,
чистые виртуальные должны реализовываться в производных, это не строгое правило,
но просто функцию базового класса ты не вызовешь по любому.

Добавлено через 17 минут
Задача на 2 рубля 50 копеек.

Добавлено через 2 минуты
Задача из разряда академических.

Добавлено через 32 минуты
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
#include <iostream.h>
#define interface struct
 
 
interface IVolume {
virtual ~IVolume(){};
virtual double FindVol(double x, double y, double t) = 0;
};
 
 
class CParall : public IVolume{
public:
CParall(){ cout<<"CParall type obj create\n";  }
virtual ~CParall(){ cout<<"CParall type obj destroy\n"; }
virtual double FindVol(double x, double y, double t){ return x*y*t;}
};
 
 
//В этом классе не вижу логики, ну поформуле так получается.
class CPyramid : public IVolume {
public:
CPyramid() { cout<<"CPyramid type obj create\n";  }
virtual  ~CPyramid() { cout<<"CPyramid type obj destroy\n"; }
virtual double FindVol(double x, double y, double t){ return x*y*t;}
};
 
class CSphere : public IVolume {
public:
CSphere() { cout<<"CSphere type obj create\n"<<'\n';  }
virtual   ~CSphere() { cout<<"CSphere type obj destroy\n"; }
virtual double FindVol(double x, double y, double t){
    y = 0;
    t = 0;
    return (4*3.14*x/3)/3; 
}
 
 
};
 
 
 
 
 
int main(){
const int size = 3;
CParall *cp = new CParall ;
CPyramid *cpyr = new CPyramid ;
CSphere  *cs = new CSphere ;
IVolume *i_ptr[size] = {cp,cpyr,cs};
cout<<i_ptr[0]->FindVol(2,3,4)<<'\n';
cout<<i_ptr[1]->FindVol(2,3,2)<<'\n';
cout<<i_ptr[2]->FindVol(5,0,0)<<'\n';
cout<<'\n';
for(int i =0;i<size;i++)delete i_ptr[i];
cout<<'\n';
return 0;
}
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
02.03.2010, 19:17     абстрактный базовый класс #4
Genius Ignat, даже если виртуальная функция чистая, её всё равно можно определять и вызывать. Потомки класса будут обязаны переопределить эту функцию, но вызывать базовую можно, указывая этот вызов явно:
C++
1
2
derived d;
double v = d.base::func(3);
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
02.03.2010, 20:54     абстрактный базовый класс #5
Nick Alte.
Я имел в виду про базовый класс, объект базового не сможет вызвать так как его создать нельзя ,
а то что производные могут вызвать, я не говорил, в данном контексте не видел смысла говорить
об этом.


derived d;
double v = d.base::func(3);
Я Классы интерфейсы не использую так, в этом не вижу смысла, так как функции:
абстрактные функции надо определять в производных классах, и не трогать функцию базового,
так как это будет ошибкой.

Правильнее было бы так: но в контекст темы это не вписывается.
C++
1
2
3
4
5
6
7
8
9
class base
{
public:
  virtual double func(int);
}
double base::func(int a)
{
  return a*a*a;
}

....
pIUnKnown->Release();
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
03.03.2010, 20:09     абстрактный базовый класс #6
Обычно "чистые" функции определяют в том случае, когда надо, чтобы потомки обязательно переопределяли данный метод, но при этом обеспечить функциональность, общую хотя бы для большинства потомков. Иногда это делается в иллюстративных целях, для повышения ясности и читаемости кода.
Хотя и нельзя отрицать, что в ряде случаев этот метод полезен, применяется он нечасто. Нежелание Genius Ignat применять его с интерфейсами полностью оправдано, потому что этот метод входит в идеологическое противоречие с их концепцией и если даже и не вызовет путаницу, всё равно получится грязно и неаккуратно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2010, 20:19     абстрактный базовый класс
Еще ссылки по теме:

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

Создать абстрактный базовый класс список - C++
Создать абстрактный базовый класс список. Реализовать на его базе классы стек и очередь с виртуальными функциями добавления и удаления...

Создать абстрактный базовый класс Figure - C++
Здравствуйте,помогите пожалуйста с задачей. Создать абстрактный базовый класс Figure с виртуальной функцией - площадь поверхности....

Реализовать абстрактный базовый класс «Фигура» - C++
Пожалуйста, помогите решить следующую задачу: Реализовать абстрактный базовый класс «Фигура», содержащий методы вычисления площади и...

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


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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.03.2010, 20:19     абстрактный базовый класс #7
Domino's,
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
class Shape
{
public:
  virtual double GetVolume() = 0;
};
 
class Parallelepiped : public Shape
{
public:
  Parallelepiped(double x, double y, double z)
  : x(x)
  , y(y)
  , z(z)
  {}
 
  double GetVolume()
  {
    return x * y * z;
  }
 
private:
  double x;
  double y;
  double z;
};
 
class Pyramid : public Shape
{
public:
  Pyramid(double x, double y, double h)
  : x(x)
  , y(y)
  , h(h)
  {}
 
  double GetVolume()
  {
    return x * y * h;
  }
 
private:
  double x;
  double y;
  double h;
};
 
class Sphere : public Shape
{
public:
  Sphere(double r)
  : r(r)
  {}
 
  double GetVolume()
  {
    const double pi = 3.14;
    
    return (4 * pi * r * r * r) / 3;
  }
 
private:
  double r;
};
Yandex
Объявления
03.03.2010, 20:19     абстрактный базовый класс
Ответ Создать тему
Опции темы

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