0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 5
1

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

22.12.2014, 21:11. Показов 6276. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2014, 21:11
Ответы с готовыми решениями:

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

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

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

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

8
2644 / 2220 / 239
Регистрация: 03.07.2012
Сообщений: 8,064
Записей в блоге: 1
22.12.2014, 21:13 2
Для этого придуманы виртуальные функции.
1
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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 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
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 5
22.12.2014, 22:35  [ТС] 5
Tulosba, большое спасибо.Теперь всё заработало.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.12.2014, 22:37 6
Цитата Сообщение от MrBlackD Посмотреть сообщение
Теперь всё заработало.
Только не вздумайте брать этот пример как готовое решение. В нем есть некоторые нюансы
0
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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.12.2014, 23:09 8
Цитата Сообщение от MrBlackD Посмотреть сообщение
я конечно не знаю что за нюансы
При выделении памяти из кучи (через оператор new), память в дальнейшем нужно освободить (через delete). Но т.к. оперирование данными осуществляется через указатель на базовый класс, в базовом классе нужно добавить виртуальный деструктор.
0
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2014, 23:15
Помогаю со студенческими работами здесь

Вызов метода объекта внутри определения метода другого объекта(вложенные классы)
Как мне вызвать метод объекта slider класса Slider внутри определения метода объекта класса...

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

Вызов метода из метода
Можно ли вызвать метод из метода. Это программа не работает #include&lt;iostream&gt; using namespace...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru