LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

то просто получишь ответ «no-such-method»

Так и в крестах ты получишь тот же ответ. Только на этапе компиляции - и это хорошо.

Выше уже согласились, что работает только в жёсткой статике:

class Object {};
Object *obj = deserialize(file);

try {
    obj->new_run();
} except {
    obj->run();
}

не компилируется

class Object {};

class ObjectV1: public Object 
{ public: virtual void run(); };

class ObjectV2: public ObjectV1 
{ public: virtual void new_run(); };

Object *obj = deserialize(file);

try {
    (ObjectV2 *)obj->new_run();
} except {
    (ObjectV1 *)obj->run();
}

всегда выполняет new_run, даже если deserialize вернул new ObjectV1().

Исправление monk, :

то просто получишь ответ «no-such-method»

Так и в крестах ты получишь тот же ответ. Только на этапе компиляции - и это хорошо.

Выше уже согласились, что работает только в жёсткой статике:

class Object {};
Object *obj = deserialize(file);

try {
    obj->new_run();
} except {
    obj->run();
}

не компилируется

class Object {};

class ObjectV1: public Object 
{ public: virtual void run(); };

class ObjectV2: public ObjectV1 
{ public: virtual void new_run(); };

Object *obj = deserialize(file);

try {
    (ObjectV2 *)obj->new_run();
} except {
    (ObjectV1 *)obj->run();
}

всегда выполняет new_run, даже если deserialize вернул new ObjectV1().

Исходная версия monk, :

то просто получишь ответ «no-such-method»

Так и в крестах ты получишь тот же ответ. Только на этапе компиляции - и это хорошо.

Выше уже согласились, что работает только в жёсткой статике:

class Object {};
Object *obj = deserialize(file);

try {
    obj->new_run();
} except {
    obj->run();
}

не компилируется

class Object {};

class ObjectV1: public Object 
{ public: virtual void run(); };

class ObjectV2: public ObjectV1 
 public: virtual void new_run(); };

Object *obj = deserialize(file);

try {
    (ObjectV2 *)obj->new_run();
} except {
    (ObjectV1 *)obj->run();
}

всегда выполняет new_run, даже если deserialize вернул new ObjectV1().