Бьерн Страуструп.
Язык программирования С++
43
{
public:
void
trace
();
//
...
};
class displayed
{
public:
void
trace
();
//
...
};
class my_displayed_task:public displayed, public task
{
// в этом классе trace () не определяется
};
void g ( my_displayed_task * p )
{
p
-
> trace (); // ошибка: неоднозначность
}
В этом примере видны отличия С++ от объектно-ориентированных диалектов языка Лисп, в
которых
есть множественное наследование. В этих диалектах неоднозначность разрешается так: или считается
существенным порядок описания, или считаются идентичными объекты с
одним и тем же именем в
разных базовых классах, или используются
комбинированные способы, когда совпадение объектов
доля базовых классов сочетается с более сложным способом для производных классов. В С++
неоднозначность, как правило, разрешается введением еще одной функции:
class my_displayed_task:public displayed, public task
{
//
...
public:
void
trace
()
{
//
текст пользователя
displayed::trace
();
//
вызов trace () из displayed
task::trace (); //
вызов trace () из task
}
//
...
};
void g ( my_displayed_task * p )
{
p
-
> trace (); // теперь нормально
}
Достарыңызбен бөлісу: