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

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте. В приведенном коде есть класс-шаблон А, и его наследники (классы 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.04.2017, 19:19
Ответы с готовыми решениями:

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

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

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

5
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
30.04.2017, 19:31
Цитата Сообщение от Вероника99 Посмотреть сообщение
По заданию нужен именно массив указателей на базовый класс
На данный момент у вас просто массив элементов базового класса.

C++
1
    A <string>** obj_a=new A<string>*[m];
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
30.04.2017, 19:34
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
Вероника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  [ТС]
Спасибо,даже и не догадалась,что A <string>* obj_a - это просто массив элементов,надо было уже что-то заподозрить,когда обращение к методу Get было возможно только с помощью ".",а не с помощью "->"
0
0 / 0 / 0
Регистрация: 22.07.2017
Сообщений: 1
22.07.2017, 19:11
О, похожая ошибка. Никак не мог понять. Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.07.2017, 19:11
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru