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; }
};
