Трабл с typeid
От: Ubivetz Украина  
Дата: 24.05.06 09:46
Оценка:
Доброго времени суток!

Роюсь в чужом коде и обнаружил интересную пакость:


class BalanceForwardingData : public Entity
{
...
};
class Entity
{
protected:
    RecordStatus _recordStatus;
public:
    virtual ~Entity() {};
...
    void setModified()
    {
        if (_recordStatus != usInserted)
            _recordStatus = usModified;
    }
...
    virtual Entity* clone()
    {
        ...
        return NULL;
    }
};
...
bool Writer::writeBalanceForwardingData(BalanceForwardingData* balance)
{
    cout << "bool Writer::writeBalanceForwardingData" << endl;
    if ( balance != NULL )
    {
    try
    {
        string s1 = typeid(*balance).name();
        string s2 = typeid(BalanceForwardingData).name();
        cout << "balance != NULL and type of *balance=" << s1<<endl;

        cout << "type of BalanceForwardingData=" <<  s2 <<endl;

        if ( s1 == s2 )
        {
        cout << "And these types are equal" << endl;
        }
        else
        {
        cout << "And these types are *NOT* equal" << endl;
        }

        if ( typeid(*balance) != typeid(BalanceForwardingData) )
        {
        cout << "typeid(*balance) != typeid(BalanceForwardingData)" << endl;
        }
        else
        {
        cout << "typeid(*balance) == typeid(BalanceForwardingData)" << endl;
        }
    }
    catch ( bad_typeid & e )
    {
        cout <<  "bad_typeid raised! The reason is " << e.what() << endl;
    }
    }

    if (balance != NULL && typeid(*balance) == typeid(BalanceForwardingData))
    {
     ...
     // Сюда не заходит
    }

Компиллятор GCC 3.3.
Вот что выводит программа:

balance != NULL and type of *balance=N7MaxBill21BalanceForwardingDataE
type of BalanceForwardingData=N7MaxBill21BalanceForwardingDataE
And these types are equal
typeid(*balance) != typeid(BalanceForwardingData)

Чтог бы это значило?
При этом я посмотрел по коду, balance создаётся вызовом new BalanceForwardingData;
Эх, люблю выпить и переспать с кем нибудь!
Но чаще выходит перепить с кем — нибудь и выспаться...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.