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

Вектор объектов разных классов. Доступ к свойствам элемента вектора - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Кто умеет строить блок схемы? http://www.cyberforum.ru/cpp-beginners/thread881606.html
Написал программу в с++ и не могу построить блок схему...нужно для курсовой... помогите кому не сложно...программа в общем строит последовательность из рекурентного соотношени и делает для первых пяти чисел всевозможные перестановки #include <iostream> #include <algorithm> float ai(int i) // рекурсивная функция вычисления а; { if (i==0) return 2; else if (i==1) return 3; ...
C++ Библиотека Barfic Насколько я понял это библиотека отвечает за псевдографику в консоли. Где её можно взять? А то гугл молчит по этому вопросу. http://www.cyberforum.ru/cpp-beginners/thread881604.html
C++ Запись в файл из вектора
ofstream outfile("ITER.txt"); ostream_iterator<int> Co(outfile," "); copy(v1.begin(),v1.end(),Co); Есть вектор заполненый значениями <int> - v1 надо закинуть инфу из вектора в файл... файл создается но туда не попадает инфа из вектора v1. в Чем проблема?
Перечисление значений. Ease на примере InQuad C++
В общем суть такая, например у меня есть: float time = 1.5f; //Время за которое должна произойти функция int value_from = 1000; //Значение откуда int temp_value_from = value_from; //Пригодится в конце int value_to = 0; //значение куда int amount = 19; // надо оно или нет, но допустим это количество операций, за которое должно все произойти. Можно и другое число. float delay; //задержка Я...
C++ Как сделать, чтобы в формуле не выскакивало число, а получалось выражение? http://www.cyberforum.ru/cpp-beginners/thread881586.html
Мне нужно, чтобы в l0 не считалось полностью число, а получалась формула. Ведь я ввела "char X_arg_const" как переменную и мне нужно, чтобы при введенных значениях Х получалось выражение с одной переменной X_arg_const. Это нужно, чтобы при остальных l (l1, l2, l3) потом составить многочлен. Помогите, пожалуйста. А то я не понимаю, как тут вообще считается число, если X_arg_const даже не задан....
C++ Найти повторяющиеся строки (от 2-х и больше) и сообщить их кол-во Друзья, помогите мне пожалуйста закончить программу. 1) От программы нужно чтобы он открывал текстовый файл (в котором находятся несколько строк на английском языке). Подсчитал их количество. 2) Сравнил каждую строку. 3) И найти повторяющиеся строки (от 2-х и больше) и сообщить их количество #include <stdio.h> #include <alloc.h> #include <string.h> int strcmp(char *str1, char *str2); ... подробнее

Показать сообщение отдельно
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
30.05.2013, 21:28     Вектор объектов разных классов. Доступ к свойствам элемента вектора
Полиморфность при наследовании определяется наличием виртуальных методов. Вот пример не полиморфного наследования. Ни лобовое применения typeinfo ни косвенное выяснение типов через указатель базового класса не различают наследников на которые он указывает. Доступа к данным наследников (легального)) по такому указателю нет:
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
//если в базовом классе нет виртуальных методов, то наследование не полиморфно
//и типом указателя базового класса всегда является базовый класс, независимо от
//инициализации, 
#include <iostream>
#include <typeinfo.h>
using namespace std;
class A
{
public:
int a;
A():a(0){}
A(int _a):a(_a){}
};
class B: public A
{
public:
int b;
B():A(),b(0){}
B(int _a, int _b):A(_a), b(_b){}
};
class C: public A
{
public:
int c;
C():A(),c(0){}
C(int _a, int _c):A(_a),c(_c){}
};
template <class T>
void showType(T *a){
cout<<typeid(*a).name()<<endl;
}
int main() {
A* ptrBase;
A a(10);
B b(1,2);
C c(3,4);
ptrBase=&a;
showType(ptrBase);
ptrBase=&b;
showType(ptrBase);
//cout<<ptrBase->a<<endl;//это нормально, что и не удивительно
//ptrBase->b; //это даже не компилирутся
//cout<<(dynamic_cast<B*>(ptrBase))->b<<endl;//это тоже не компилирутся: dynamic_cast: "A" не является полиморфным типом
cout<<((B*)(ptrBase))->b<<endl;// а напролом - работает, но врядли это нормально))
ptrBase=&c;
showType(ptrBase);
system("pause");
cout << endl;
return 0;
}
А вот классы-наследники переопределяющие метод виртуальный базового класса. Причем сами методы не используются. Они определены чтобы сделать наследование полиморфным. И наследники стали полиморфны что и видно в коде. Теперь можно выяснить их тип и получить доступ к их данным (не методам) через указатель на базовый класс вполне легально:
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
#include <iostream>
#include <typeinfo.h>
using namespace std;
class A
{
public:
int a;
A():a(0){}
A(int _a):a(_a){}
virtual void Who_s_there_You_Horatio(){cout<<"A"<<endl;}
};
class B: public A
{
public:
int a;
int b;
B():A(),b(0){}
B(int _a, int _b):A(_a),b(_b){}
void Who_s_there_You_Horatio(){cout<<"B"<<endl;}
};
class C: public A
{
public:
int a;
int c;
C():A(),c(0){}
C(int _a, int _c):A(_a),c(_c){}
void Who_s_there_You_Horatio(){cout<<"C"<<endl;}
};
template <class T>
void showType(T *a){
cout<<typeid(*a).name()<<endl;
}
//мы не использовали виртуальные методы, но важно, что они есть
//это позволяет различить типы по указателю и получить доступ и к данным наследников
//практически без бандитизма))
int main() {
A* ptrBase;
A a(10);
B b(1,2);
C c(3,4);
 
ptrBase=&a;
showType(ptrBase);
ptrBase=&b;
showType(ptrBase);
cout<<((B*)(ptrBase))->b<<endl; //
ptrBase=&c;
showType(ptrBase);
system("pause");
cout << endl;
return 0;
}
хотя и методы тоже вызвать можно.
 
Текущее время: 15:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru