Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прога экзамен.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
272 Кб
Скачать
☆

Void * operator new(size_t size)

{ cout << "Operator New" << endl;

return ::new Sample();

}

Void operator delete(void *p, size_t size)

{ ::delete p;

cout << "Operator Delete" << endl;

}

~Sample()

{ cout << "Destructor" << endl;

}

};

Void main()

{ Sample *ptr = new Sample;

delete ptr;

}

67.    Друзья классов как возможность расширения интерфейса класса. Дайте определение дружественной функции. Как объявляется дружественная функция? А как определяется?

68.    Выберите верный вариант объявления метода M() класса A другом класса B:

        class B {friend void A::M(); };

        class B :friendA::M(){ };

        class A {friend class B void M(); };

69.    Опишите синтаксис определения производного класса. Как в производном классе определяется доступность полей базового класса? Какие функции не наследуются?

70.    Дана иерархия классов:

class Base {

public:

bar( int );

protected:

int ival;

};

 

class Derived1 : virtual public Base {

public:

bar( char );

foo( char );

protected:

char cval;

};

 

class Derived2 : virtual public Base {

public:

foo( int );

protected:

int ival;

char cval;

};

 

class VMI : public Derived1, public Derived2 {};

К каким из унаследованных членов можно обращаться из класса VMI, не квалифицируя имя? А какие требуют квалификации?

 

71.    Дан класс Base с тремя конструкторами:

class Base {

public:

Base();

Base( string );

Base( const Base& );

protected:

string _name;

};

Определите соответствующие конструкторы для каждого из следующих классов:

(a) любойиз

class Derived1 : virtual public Base { ... };

class Derived2 : virtual public Base { ... };

(b) class VMI : public Derived1, public Derived2 { ... };

(c) class Final : public VMI { ... };

 

72.    Какие из следующих объявлений ошибочны? Почему?

        class CADVehicle : public CAD, Vehicle { ... };

        class DoublyLinkedList:public List, public List { ... };

       class iostream: private istream, private ostream { ... };

 

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

class A { ... };

class B : public A { ... };

class C : public B { ... };

class X { ... };

class Y { ... };

class Z : public X, public Y { ... };

class MI : public C, public Z { ... };

Каков порядок вызова конструкторов в таком определении: MI mi;

 

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

class X { ... };

class A { ... };

class B : public A { ... };

class C : private B { ... };

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

 

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

D *pd = new D;

X *px = pd;

A *pa = pd;

B *pb = pd;

C *pc = pd;

 

75.    Чем открытое наследование отличается от закрытого и защищенного?

 

76.    При порождении класса-наследника от базового класса с атрибутом public public-компоненты базового класса становятся компонентами производного класса с атрибутом …?

 

77.    При порождении класса-наследника от базового класса с атрибутом private public-компоненты базового класса становятся компонентами производного класса с атрибутом …?

 

78.    Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен? Что происходит, если имя метода-наследника совпадает с именем базового метода?

 

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

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();

virtualvoiddebug();

};

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

Base *pb = new MI;

pb->print();

pb->debug();

pb->readOn();

pb->writeOn();

pb->log();

delete pb;

80.    Сформулируйте принцип подстановки. Что такое срезка (расщепление) объекта и когда она происходит? Когда срезка происходит при копировании объектов?

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

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();

virtualvoiddebug();

};

Определите, какие виртуальные функции активны при вызове через pd1 и d2:

        Derived1 *pd1 =new MI;

        MI obj;

Derived2 d2 = obj;

82.    Укажите правильные операторы присваивания:

Base& Base operator=(const Base & t);

Derive& Derive operator=(const Derive & t);

Base b1, b2;

Derive d1, d2;

b1=b2;

d1=d2;

b1=d2;

d1=b1;

d2=b1;

83.    Укажите правильные операторыприсваивания:

Base& Base operator=(const Base & t);

Derive& Derive operator=(const Derive & t);

Derive& Derive operator=(const Base & t){

this--> Base::operator=(t);

return *this;

}

Base b1, b2;

Derive d1, d2;

b1=b2;

d1=d2;

b1=d2;

d1=b1;

d2=b1;

84.    Выполняется ли принцип подстановки при открытом множественном наследовании?

85.    Укажите особенности использования указателей базового класса для производного класса.

86.    Виртуальное наследование, его преимущества и недостатки по сравнению с обычным наследованием? Влияет ли виртуальное наследование на размер класса?

87.    Назвать виртуальные функции и объяснить их работу:

struct base {

virtual void f1() { cout << "\nbase::f1"; }

virtual void f2() { cout << "\nbase::f2"; }

virtual void f3() { cout << "\nbase::f3"; }

};

struct dir: public base {

void f1() { cout << "\ndir::f1"; }

intf2() { cout << "\ndir::f2"; }

void f3(int i) { cout << "\ndir::f3::i = " << i; }

};