Понедельник, Июль 5th, 2010

Шпоры по С++

class Derived : ключ_доступа Base [; ключ_доступа Base2, …]
{ . . .};
Ключ_доступа не является обязательным и может быть private, protected или public. Если он не указан, доступ принимается по умолчанию private для классов и public для структур. При наследовании ключ доступа определяет уровень доступа к элементам базового класса внутри производного класса. В следующем примере В1 является общедоступным базовым классом для Derived, В2 является защищенным базовым классом для Derived и В3 является частным базовым классом для Derived.
class B1 {. . .};
class B2 { . . .};
class B3 { . . .};
class Derived : public B1, protected B2, private B3
{ . . . };
Если базовый класс наследуется как private, его элементы будут являться private в производном классе. Однако можно выборочно сделать некоторые из элементов базового класса общедоступными в производном классе, указав их в секции public производного класса:
class Base
{public:
void f1( );
void f2( );
};
class Derived : private Base
{public:
Base :: f1; // Делает void Base :: f1( ) доступной как public
};
Простым наследованием называется, когда производный класс имеет всего один базовый класс.
Конструкторы не наследуются. Если конструктор базового класса требует спецификации одного или нескольких параметров, то конструктор производного класса должен вызывать базовый конструктор, используя список инициализации элементов.
Деструктору производного класса, напротив, не требуется явно вызывать деструктор базового класса. В деструкторе производного класса компилятор автоматически генерирует вызовы базовых деструкторов.

30. Виртуальные функции и их использование

Функция-элемент может быть объявлена как virtual. Ключевое слово virtual предписывает компилятору генерировать некоторую дополнительную информацию о функции. Если функция преопределяется в производном классе и вызывается с указателем (или ссылкой) базового класса, ссылающимся на представитель производного класса, эта информация позволяет определить, какой из вариантов функции должен быть выбран: такой вызов будет адресован функции производного класса.
Следующий пример демонстрирует разницу между виртуальными и невиртуальными функциями.
#include
class Base
{public:
virtual void virt( )
{printf( “Hello from Base :: virt \n” ); }
void nonvirt( )
{printf( “Hello from Base :: nonvirt \n” );}
};
class Derived:public Base // Производный класс: заменяет обе
{ public: // функции класса Base
void virt( )
{printf( “Hello from Derived :: virt \n” ); }
void nonvirt( )
{printf( “Hello from Derived :: nonvirt \n” ); }
};
int main ( void ) // Функция main
{Base *bp = new Derived; //Базовый указатель, реально
// ссылающийся на производный

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Категория: Шпоры