Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
4 / 4 / 0
Регистрация: 28.10.2015
Сообщений: 51
1

Доступ к функциям унаследованного класса

19.02.2017, 14:21. Показов 978. Ответов 5
Метки нет (Все метки)

Не знаю как в двух словах описать проблему поэтому если что, модераторы поправьте название темы.
У меня есть n количество разных классов каждый со своими методами и полями, мне нужно чтобы у них было несколько общих методов и хранить эти классы в одном списке, поэтому я создал базовый класс с нужными виртуальными методами и наследовал от него остальные. Примерно так
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
 
class BaseClass
{
public:
    virtual ~BaseClass();
    virtual void GetInfo() = 0;
 
protected:
    BaseClass();
};
 
BaseClass::BaseClass()
{
}
 
BaseClass::~BaseClass()
{
}
 
/////////////////////////////////////////
 
class MyClass1 : public BaseClass
{
public:
    MyClass1();
    ~MyClass1();
    void GetInfo();
    void GetMyClass1Info();
 
private:
};
 
MyClass1::MyClass1()
{
}
 
MyClass1::~MyClass1()
{
}
 
void MyClass1::GetInfo()
{
    std::cout << "my class 1" << std::endl;
}
 
void MyClass1::GetMyClass1Info()
{
    std::cout << "my class 1 info" << std::endl;
}
 
/////////////////////////////////////////
 
class MyClass2 : public BaseClass
{
public:
    MyClass2();
    ~MyClass2();
    void GetInfo();
    void SetParamMyClass2(int i);
private:
        int p;
};
 
MyClass2::MyClass2()
{
}
 
MyClass2::~MyClass2()
{
}
 
void MyClass2::GetInfo()
{
    std::cout << "my class 2" << std::endl;
}
 
void MyClass2::SetParamMyClass2(int i)
{
    p = i;
}
 
/////////////////////////////////////////
 
void main()
{
    std::vector<BaseClass*> components;
    components.push_back(new MyClass1());
    components.push_back(new MyClass2());
 
    components[0]->GetInfo();
    components[1]->GetInfo();
 
    system("pause");
}


Все хорошо, все в одном списке, можно работать с общими методами, но как получить доступ из этого списка к собственным полям и методам этих классов? что то вроде
C++
1
2
3
std::vector<BaseClass*> components;
components.push_back(new MyClass2());
components[0]->SetParamMyClass2(5); //<---?
Это надо как то темплейты использовать?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2017, 14:21
Ответы с готовыми решениями:

Доступ к параметрам и функциям базового класса
Собственно вот код: class okno : public zakaz { public: xy razmer; vector &lt;xy&gt; paket;...

Доступ функциям производного класса через базовый
В общем, я только изучаю С++ и не могу понять. Как можно получить доступ к функциям из объекта...

Почему при обращении к методам класса через точку VS показывает в том числе и private методы унаследованного класса?
Есть три класса. Каждый наследует другой с модификатором наследования private. Соответственно...

Почему VS при обращении к методам класса через точку показывает в том числе и private методы унаследованного класса?
Есть два класса. Один наследует другой с модификатором наследования private. Соответственно...

5
281 / 235 / 114
Регистрация: 07.09.2016
Сообщений: 587
19.02.2017, 14:25 2
к невиртуальным методам производных классов - нормально никак. можно попытаться кастить с проверкой к конкретным производным классам, но это грязный хак.
0
Эксперт С++
1667 / 1039 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
19.02.2017, 14:46 3
Если надо хранить в одном списке - значит, есть потребность обращаться со всеми этими объектами единообразно. Описание того, как именно с ними обращаться - это интерфейс: класс, в котором содержатся объявления (не реализации!) нужных функций, объявленных как чистые виртуальные. Больше в интерфейсе ничего не должно быть. Реальные классы наследуют от интерфейса и реализуют эти функции.
0
4 / 4 / 0
Регистрация: 28.10.2015
Сообщений: 51
19.02.2017, 14:54  [ТС] 4
Мой пример мог сбить с толку, поэтому повторюсь у классов наследников самые разные поля и методы, их невозможно все описать в базовом классе, в первую очередь мне нужен прямой доступ к переменным классов.
0
Эксперт С++
1597 / 929 / 777
Регистрация: 06.02.2016
Сообщений: 2,414
Записей в блоге: 29
19.02.2017, 14:59 5
Лучший ответ Сообщение было отмечено Gypnori как решение

Решение

Gypnori,
C++
1
2
3
4
5
std::vector<BaseClass*> components;
    components.push_back(new MyClass2());
    if(dynamic_cast<MyClass2*>(components[0])) {
        static_cast<MyClass2*>(components[0])->SetParamMyClass2(5);
    }
1
4 / 4 / 0
Регистрация: 28.10.2015
Сообщений: 51
19.02.2017, 16:59  [ТС] 6
Скажите, а вот с точки зрения производительности как этот метод? Даже если без проверки сам по себе static_cast если его вызывать большое количество раз, я имею ввиду это просто приведение типа или что то гораздо более сложное?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2017, 16:59

События у унаследованного VCL класса
Здравствуйте. Есть проблемка: Есть класс, унаследованный от TImage. Нужно чтобы, при...

Инициализация класса, унаследованного от QWidget
Доброго времени суток. Пожалуйста объясните темному как сделать следующее. Имеем класс: class...

Нужно ли самому удалять экземпляр класса, унаследованного от QThread?
Привет! Есть класс, унаследованный от QThread с макросом Q_OBJECT, создаю я этот экземпляр при...

Как получить данные из унаследованного класса через промежуточный класс?
Есть три класса: Background.cpp: #pragma once class Background { public:

Нужно вывести информацию из унаследованного класса
Всем доброго времени суток)) Я недавно начала изучать WindowsForm и столкнулась со следующей...

Доступ к функциям QML
У меня есть описанная модель: ListModel{ id: mainlist ListElement { ...


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

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

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