Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 463
1

Почему не работает позднее связывание

30.04.2017, 19:19. Показов 1137. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. В приведенном коде есть класс-шаблон А, и его наследники (классы B,C,D). В main создаю масcив указателей на базовый шаблонный класс
C++
1
    A <string>*obj_a=new A<string>[m];
Далее пытаюсь сделать позднее связывание
C++
1
     obj_a[i]=obj_b;
В результате в конечном выводе, указатели obj_a всегда обращаются к базовому классу. При таком варианте:
C++
1
 obj_a[i]=&obj_b;
срабатывает ошибка: бинарный "=": не найден оператор, принимающий правый операнд типа "B *" или
может быть "A<T> &A<T>::operator =(const A<T> &)"
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
template <class T> 
class A
{
protected:
    T x;
public:
    A()
    {
 
        x="A";
    }
    
    virtual T Get()
    {
        return x;
    }
};
 
class B:public A <string>
{
private:
    string b;
public:
    B()
    {
        b="B";
    
    }
 
    virtual string Get() 
    {
        return b;
    }
};
...
int main()
{
    const int m=10;
    A <string>*obj_a=new A<string>[m];
    B obj_b;
    C obj_c;
    D obj_d;
    for(int i=0;i<m;i++)
    {
        int n=rand()%3;
        if(n==0)
        {
             obj_a[i]=obj_b;
            
        }
        if(n==1)
        {
            obj_a[i]=obj_c;
            
        }
        if(n==2)
        {
            obj_a[i]=obj_d;
            
        }
        
    }
 
    for(int i=0;i<m;i++)
    {
        cout<<"Object "<<i<<" - "<<typeid(obj_a[i]).name()  <<endl<<endl;
        cout<<obj_a[i].Get()<<endl;
    }
 
 
 
    return 0;
}
Подскажите пожалуйста,как все таки с помощью obj_a[i]), сделать обращение к классу наследнику?
По заданию нужен именно массив указателей на базовый класс
Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2017, 19:19
Ответы с готовыми решениями:

Позднее связывание
Всем привет! Нужно сделать такую программу: используя механизм позднего связывания построить список...

Позднее и раннее связывание
у меня проблема не могу разобратся с этим &quot;приведите пример (без реализации методов) познего и...

Раннее и позднее связывание
Вот компилятор статическую функцию как бы компилирует ранним связыванием, а динамическую - поздним....

В дизассемблерованном коде отсутствует позднее связывание. Оптимизация?
Добрый день/утро/вечер (нужное подчеркнуть)) Выдалось свободное время и решил немного пописать...

5
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
30.04.2017, 19:31 2
Цитата Сообщение от Вероника99 Посмотреть сообщение
По заданию нужен именно массив указателей на базовый класс
На данный момент у вас просто массив элементов базового класса.

C++
1
    A <string>** obj_a=new A<string>*[m];
1
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
30.04.2017, 19:34 3
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;
template <class T> 
class A
{
protected:
    T x;
public:
    A()
    {
 
        x="A";
    }
    
    virtual T Get()
    {
        return x;
    }
};
 
class B:public A <string>
{
private:
    string b;
public:
    B()
    {
        b="B";
    
    }
 
    virtual string Get() 
    {
        return b;
    }
};
 
class C:public A <string>
{
private:
    string b;
public:
    C()
    {
        b="C";
    
    }
 
    virtual string Get() 
    {
        return b;
    }
};
 
class D:public A <string>
{
private:
    string b;
public:
    D()
    {
        b="D";
    
    }
 
    virtual string Get() 
    {
        return b;
    }
};
 
int main()
{
    const int m=10;
    A <string>**obj_a=new A<string>*[m];
    B obj_b;
    C obj_c;
    D obj_d;
    for(int i=0;i<m;i++)
    {
        int n=rand()%3;
        if(n==0)
        {
             obj_a[i]= &obj_b;
            
        }
        if(n==1)
        {
            obj_a[i]= &obj_c;
            
        }
        if(n==2)
        {
            obj_a[i]= &obj_d;
        }
        
    }
 
    for(int i=0;i<m;i++)
    {
        cout<<"Object "<<i << " ";
        cout<<obj_a[i]->Get()<<endl;
    }
 
 
 
    return 0;
}
1
21 / 21 / 10
Регистрация: 11.09.2015
Сообщений: 103
30.04.2017, 20:53 4
Вероника99, может попробовать нечто "дубовое"? Типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
using namespace std;
 
struct A {
  A () = default;
  A (string s) : data (s) {}
  virtual void Print () { cout << "classA" << "\n"; };
  string data;
};
struct B : A {
  B() = default;
  B(string s) : A(s) {}
  virtual void Print () override { cout << "classB" << "\n"; };
};
 
void main () {
  A* pa = (A*)new B ("I'm B");
  pa->Print();
}
Добавлено через 10 минут
Хотя A* pa = new B ("I'm B"); тоже компилируется и обеспечивает печать "classB".
0
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 463
01.05.2017, 12:43  [ТС] 5
Спасибо,даже и не догадалась,что A <string>* obj_a - это просто массив элементов,надо было уже что-то заподозрить,когда обращение к методу Get было возможно только с помощью ".",а не с помощью "->"
0
0 / 0 / 0
Регистрация: 22.07.2017
Сообщений: 1
22.07.2017, 19:11 6
О, похожая ошибка. Никак не мог понять. Спасибо
0
22.07.2017, 19:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2017, 19:11
Помогаю со студенческими работами здесь

Позднее связывание
Не могу понять казалось бы простую вещь. Позднее связывание на этапе выполнения программы. Вот...

Позднее связывание
Надо написать программу которая в папке Plugins просматривает все dll и вызывает метод Print в...

Позднее связывание
Доброго времени суток! В программе хочу применить механизм виртуальных функций, но его...

Позднее статическое связывание
Здравствуйте, &lt;?php class A { public static function foo() { static::who(); }


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru