Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
MrBlackD
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 5
#1

Вызов метода наследника - C++

22.12.2014, 21:11. Просмотров 548. Ответов 8
Метки нет (Все метки)

Доброго времени суток. Имеется 2 класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Text{
 
    public:
        Text* txt;
        int n;
        Text();
        void Add(Text A);
        void Show();
 
};
 
 
class Symbol:public Text{
    public:
        const char * sym;
        Symbol(const char *m);
        void Show();
};
все экземпляры класса Symbol я помещаю в поле txt класса Text следующим образом:
C++
1
2
3
4
Text A;
    A.Add(Symbol B("L"));
        A.Add(Symbol B("L"));
    A.Show();
Собственно суть проблемы. Хочется чтобы вызывая метод Show() класса Text вызывались методы Show() всех экземпляров Symbol. Делать я это пытался так:
C++
1
2
3
4
 void Text::Show(){
     for(int i=0;i<n;i++)
         this->txt[i].Show();
 }
И проблема в том что тут вызывается метод Show() класса Text,хотя все элементы массива - Symbol.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2014, 21:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вызов метода наследника (C++):

Вызов виртуального метода класса наследника из вектора
#include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; class A {...

Вызов деструктора класса-наследника
Всем привет! есть базовый класс и класс-наследник class Base { public:...

Вызов членов и объектов с наследника класса
Есть базовый класс и два наследника: class CBase { public: ...

Вызвать метод базового класса из метода наследника
Есть базовый класс с виртуальным методом, выводящим значение его полей. В...

Вызов конструктора базового класса из класса-наследника
Можно ли вне списка инициализации вызвать конструктор базового класса ? ...

Вызов метода из метода
Можно ли вызвать метод из метода. Это программа не работает ...

8
zer0mail
2451 / 2085 / 216
Регистрация: 03.07.2012
Сообщений: 7,566
Записей в блоге: 1
22.12.2014, 21:13 #2
Для этого придуманы виртуальные функции.
1
MrBlackD
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 5
22.12.2014, 21:30  [ТС] #3
zer0mail, сделал так:
C++
1
2
3
4
5
6
7
8
9
10
class Text{
        ......
        virtual void Show();
        ......
};
class Symbol:public Text{
    public:
        virtual void Show();
        ....
};
Но в итоге тоже самое.

Добавлено через 6 минут
Может быть проблема где то в методе добавления элемента в массив?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 void Text::Add(Text A){
     Text*temp=new Text[n];
     if(n>0){
         for(int i=0;i<n;i++)
             temp[i]=this->txt[i];
     }
     this->txt=new Text[n+1];
     if(n>0){
         for(int i=0;i<n;i++)
             this->txt[i]=temp[i];
     }
     this->txt[n]=A;
     this->n=n+1;
 }
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
22.12.2014, 22:26 #4
Лучший ответ Сообщение было отмечено MrBlackD как решение

Решение

Цитата Сообщение от MrBlackD Посмотреть сообщение
Может быть проблема где то в методе добавления элемента в массив?
Механизм виртуальных функций работает через указатели или ссылки. Т.о. и массив должен быть хотя бы из указателей.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
struct A
{
    virtual void f() { std::cout << "A\n"; }
};
 
struct B : A 
{
    virtual void f() { std::cout << "B\n"; }
};
 
int main() 
{
    A* ab[] = { new A, new B };
    
    for( A* a : ab )
    {
        a->f();
    }
 
    return 0;
}
http://ideone.com/xYBbEK
1
MrBlackD
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 5
22.12.2014, 22:35  [ТС] #5
Tulosba, большое спасибо.Теперь всё заработало.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
22.12.2014, 22:37 #6
Цитата Сообщение от MrBlackD Посмотреть сообщение
Теперь всё заработало.
Только не вздумайте брать этот пример как готовое решение. В нем есть некоторые нюансы
0
MrBlackD
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 5
22.12.2014, 22:50  [ТС] #7
Tulosba, я конечно не знаю что за нюансы,я просто в своём коде стал работать с массивом указателей. Было:
C++
1
2
3
4
5
6
7
8
9
10
class Text{
 
    public:
        Text* txt;
        int n;
        Text();
        void Add(Text A);
        virtual void Show();
 
};
Стало:
C++
1
2
3
4
5
6
7
8
9
10
class Text{
 
    public:
        Text** txt;
        int n;
        Text();
        void Add(Text *A);
        virtual void Show();
 
};
Ну и конечно реализацию функций соответственно подправил.
и main:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Text *A=new Text;
    A->Add(new Symbol("w"));
    A->Add(new Symbol("o"));
    A->Add(new Symbol("r"));
    A->Add(new Symbol("l"));
    A->Add(new Symbol("d"));
    A->Add(new Symbol("!"));
 
    //A->Show();
    Text *B=new Text;
    B->Add(new Symbol("H"));
    B->Add(new Symbol("e"));
    B->Add(new Symbol("l"));
    B->Add(new Symbol("l"));
    B->Add(new Symbol("o"));
    B->Add(new Symbol(" "));
    B->Add(A);
    B->Show();
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
22.12.2014, 23:09 #8
Цитата Сообщение от MrBlackD Посмотреть сообщение
я конечно не знаю что за нюансы
При выделении памяти из кучи (через оператор new), память в дальнейшем нужно освободить (через delete). Но т.к. оперирование данными осуществляется через указатель на базовый класс, в базовом классе нужно добавить виртуальный деструктор.
0
MrBlackD
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 5
22.12.2014, 23:15  [ТС] #9
Tulosba, я вас правильно понял?
C++
1
2
3
4
5
 Text::~Text(){
     for(int i=0;i<n;i++)
         delete this->txt[i];
     delete this->txt;
 }
только я не понимаю зачем делать деструктор виртуальным,у меня выделение памяти происходить только в базовом классе.
0
22.12.2014, 23:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2014, 23:15
Привет! Вот еще темы с решениями:

Вызов метода
Друзья подскажите пожалуйста! Есть родительский класс TModel, в нем есть метод...

Вызов метода
Добрый вечер, я не знаю c++, пытаюсь разобраться, знаком с c#, delphi. ...

Вызов метода класса
Суть в том, есть какой-то класс и его методы. Нужно , чтобы при определенных...

Вызов метода родителя
Добрый вечер, как можно заставить метод &quot;не забыть&quot; вызвать этот же метод...


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

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

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