Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2017, 19:22   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Почему не работает позднее связывание - C++

Здравствуйте. В приведенном коде есть класс-шаблон А, и его наследники (классы B,C,D). В main создаю маcсив указателей на базовый шаблонный класс
Код:
    A <string>*obj_a=new A<string>[m];
Далее пытаюсь сделать позднее связывание
Код:
obj_a[i]=obj_b;
В результате в конечном выводе, указатели obj_a всегда обращаются к базовому классу. При таком варианте:
Код:
obj_a[i]=&obj_b;
срабатывает ошибка: бинарный "=": не найден оператор, принимающий правый операнд типа "B *" или
может быть "A<T> &A<T>:perator =(const A<T> &)"

Код:
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]), сделать обращение к классу наследнику?
По заданию нужен именно массив указателей на базовый класс
Спасибо
Вероника99 вне форума Ответить с цитированием
Старый 30.04.2017, 20:56   #2
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Код:
int main()
{
    const int m=10;
    A <string> **obj_a=new A<string>* [m];
    B obj_b;
    for(int i=0;i<m;i++)
    {
        obj_a[i]=&obj_b;
    }
 
    for(int i=0;i<m;i++)
    {
        cout<<obj_a[i]->Get()<<endl;
    }
 
    delete[] obj_a;
}
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает позднее связывание в XE3 HJPotter Общие вопросы Delphi 11 24.06.2014 20:01
Позднее связывание в COM сервере lexaltd Общие вопросы Delphi 2 01.11.2013 12:32
Excel-Autocad позднее связывание gsg Microsoft Office Excel 6 21.10.2013 16:58
meta-дата и позднее связывание Voipp C# (си шарп) 1 04.07.2013 18:03
Позднее связывание _Art_ Общие вопросы C/C++ 1 19.12.2009 12:53