С++ для начинающих



         

Область видимости класса при множественном наследовании - часть 3


   Endangered::highlight();

}

inline ostream&

Panda::print( ostream &os ) const

{

   Bear::print( os );

   Endangered::print( os );

   return os;

}

Поскольку успешная компиляция производного класса, наследующего нескольким базовым, не гарантирует отсутствия скрытых неоднозначностей, мы рекомендуем при тестировании вызывать все функции-члены, даже самые тривиальные.

Упражнение 18.9

Дана следующая иерархия классов:

class Base1 {

public:

   // ...

protected:

   int    ival;

   double dval;

   char   cval;

   // ...

private:

   int    *id;

   // ...

};

class Base2 {

public:

   // ...

protected:

   float fval;

   // ...

private:

   double dval;

   // ...

};

class Derived : public Base1 {

public:

   // ...

protected:

   string sval;

   double dval;

   // ...

};

class MI : public Derived, public Base2 {

public:

   // ...

protected:

   int             *ival;

   complex<double> cval;

   // ...

};

и структура функции-члена MI::foo():

int ival;

double dval;

void MI::

foo( double dval )

{

   int id;

   // ...

}

(a)    Какие члены видны в классе MI? Есть ли среди них такие, которые видны в нескольких базовых?

(b)   Какие члены видны в MI::foo()?

Упражнение 18.10

Пользуясь иерархией классов из упражнения 18.9, укажите, какие из следующих присваиваний недопустимы внутри функции-члена MI::bar():

void MI::

bar()

{

   int sval;

   // вопрос упражнения относится к коду, начинающемуся с этого места ...

}

(a) dval = 3.14159; (d) fval = 0;

(b) cval = 'a';     (e) sval = *ival;

(c) id = 1;

Упражнение 18.11

Даны иерархия классов из упражнения 18.9 и скелет функции-члена MI::foobar():

int id;

void MI::

foobar( float cval )

{

   int dval;

   // вопросы упражнения относятся к коду, начинающемуся с этого места ...

}

(a)    Присвойте локальной переменной dval сумму значений члена dval класса Base1 и члена dval класса Derived.




Содержание  Назад  Вперед