Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полиморфизм 
:(
    Опции темы
Гость_D189D
Дата 11.11.2005, 08:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

class ICompare
{
public:
    virtual bool Compare(ICompare&)=0;
};

class CSort
{
public:
    static void Sort(ICompare*, int);
};

void CSort::Sort(ICompare* Array, int Length)
{
    Array[0].Compare(Array[1]);    //Просто пример
}

class A: public ICompare
{
private:
        int c;
public:
        A(int p): c(p) {}
    bool Compare(ICompare& Ref)
    {
        A& t=dynamic_cast<A&>(Ref);        //Здесь вылетает Segmentation Fault
    }
};

int main()
{
    A a[2]={2,1};
    CSort::Sort(a,2);
    return 0;
}



Никак не могу понять почему не работает dynamic_cast. Самое интересное, что если из A убрать private секцию и сделать конструктор без параметров, то все работает как надо
  Вверх
Neitron
Дата 11.11.2005, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



Код

class ICompare
{
public:
    virtual bool Compare(ICompare&)=0;
};
class CSort
{
public:
    static void Sort(ICompare*, int);
};
void CSort::Sort(ICompare* Array, int Length)
{
    Array[0].Compare(Array[1]); 
}
class A: public ICompare
{
private:
        int c;
public:
        A(int p): c(p) {}
    bool Compare(ICompare& Ref)
    {
        A& t=reinterpret_cast<A&>(Ref);        //!!!!=)
    }
};
int main()
{
    A a[2]={2,1};
    CSort::Sort(a,2);
    return 0;
}


Это сообщение отредактировал(а) Neitron - 11.11.2005, 10:21


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Vyacheslav
Дата 11.11.2005, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



А вот за это можно ставить смело двойку
Код

A& t=reinterpret_cast<A&>(Ref);        //!!!!=)  




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Neitron
Дата 11.11.2005, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



Vyacheslav
Наверное да, но ошибок не возникает.
Я смысла в таком коде не вижу.
я обычно делал таким способом
Код

ICompare * a = new A[2];
CSort::Sort(a,2);


Это сообщение отредактировал(а) Neitron - 11.11.2005, 14:23


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Vyacheslav
Дата 11.11.2005, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



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

class ICompare
{
public:
    ICompare(){}
    virtual bool Compare(ICompare&)=0;
};

class A: public ICompare
{
private:
        int c;
public:
    A(int p): ICompare(), c(p) {}
    bool A::Compare(ICompare& Ref);
};

class CSort
{
public:
    static void Sort(ICompare* Array[], int);
};

void CSort::Sort(ICompare* Array[], int Length)
{

    Array[0]->Compare( *Array[1] );    //Просто пример
}

int main()
{

    A a1(2);
    A a2(1);
    ICompare* a[2];
    a[0] = &a1;
    a[1] = &a2;
    CSort::Sort(a,2);
}



Все дело в том что в первоначальном варианте вы используете массив экземпляров класса A, а методе пытаетесь использовать его как массив экземпляров класса ICompare. И пока размер класса A и размер класса ICompare равны все работает.
Вот упрощенная демонстрация того, что происходит у вас
Код

//создаем массив A
  A a[2] = {2, 1};
//пытаемся использовать его как массив ICompare
  ICompare* b = a;
// для первого члена все проходит: адрес на него передается правильно
   if ( a[0] == b[0] ) {
       A& t = dynamic_cast<A&>(b[0]);
  }
// для второго и последующих адрес будет указывать со смещением если размер A  & ICompare 
// не совпадают 
  if ( &a[1] == &b[1] ) {
    A& t = dynamic_cast<A&>(b[1]);
 } else {
       cout  << "sizeof(ICompare) != sizeof(A)"  << endl;
 }





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.