Цитата:
в данном коде явная ошибка:
Код:
E* p;
p->L;
|
Это не реальный код, а теоретический. Все имена - теоретические. Первой строкой я хотел показать, что это указатель на класс E и ничего больше. Надо было добавить многоточия? Предполагалось, что он уже инициализирован нормальным адресом класса при обращении к нему во второй строке.
Затем производится обращение к чистой виртуальной функции. Я не совсем понимаю механизм, по которому будет вызвана функция, стоящая за этим L, но функция, которая будет вызвана, определена, где-то в другом месте. Переопределять L в этом классе вообще нельзя. Надо переопределять то, что стоит за этим L. Но как допустим найти, какая именно? Я не понимаю взаимосвязи между вот этой чисто виртуальной функцией, и той функцией, которая будет вызвана при обращении к ней, т.е. p->L.
Класс E не является наследником других классов, но у него есть наследники.
В реальном рабочем коде примерно следующее.
Код:
class E
{
public:
virtual BOOL L(int) = 0;
...
};
class T : public R, public E
{
...
}
class C : public E
{
public:
...
};
class F
{
public:
virtual BOOL LT(const z&, E*);
};
BOOL F::LT(const z& p, E* px)
{
if(!px || !px->L(1)) // что за функция L будет вызвана?
return FALSE;
}