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



         

Множественное наследование - часть 6


MI mi;

Упражнение 18.3

Дана иерархия, в каждом классе которой определен конструктор по умолчанию:

class X { ... };

class A { ... };

class B : public A { ... };

class C : private B { ... };

class D : public X, public C { ... };

Какие из следующих преобразований недопустимы:

D *pd = new D;

(a) X *px = pd;   (c) B *pb = pd;

(b) A *pa = pd;   (d) C *pc = pd;

Упражнение 18.4

Дана иерархия классов, обладающая приведенным ниже набором виртуальных функций:

class Base {

public:

   virtual ~Base();

   virtual ostream& print();

   virtual void debug();

   virtual void readOn();

   virtual void writeOn();

   // ...

};

class Derived1 : virtual public Base {

public:

   virtual ~Derived1();

   virtual void writeOn();

   // ...

};

class Derived2 : virtual public Base {

public:

   virtual ~Derived2();

   virtual void readOn();

   // ...

};

class MI : public Derived1, public Derived2 {

public:

   virtual ~MI();

   virtual ostream& print();

   virtual void debug();

   // ...

};

Какой экземпляр виртуальной функции вызывается в каждом из следующих случаев:

Base *pb = new MI;

(a) pb->print();   (c) pb->readOn();   (e) pb->log();

(b) pb->debug();   (d) pb->writeOn();  (f) delete pb;

Упражнение 18.5

На примере иерархии классов из упражнения 18.4 определите, какие виртуальные функции активны при вызове через pd1 и pd2:

(a) Derived1 *pd1 new MI;

(b) MI obj;

    Derived2 d2 = obj;




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