КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Использование конструкторов и деструкторов
ПРИмер Пример Void Display(void) Пример Квалификация доступа к отдельным членам Спецификатор базового класса потенциально влияет на все наследуемые члены. class A { public: int x; A() { count << “Inside A’ s constructor\n”; x = 0; } { cout << ”x = = ” << x << ‘\n’; } }; Допустим: класс В наследует А в качестве закрытого базового класса: class B: private A { public: B(): A() {cout << “Inside B’s constructor\n”; } }; Т.к. класс А - закрытый в B, все прежде открытые в А члены теперь закрытые в B, след-но, во всех последующих производных от В классах или внешних по отношению к В операторах нельзя вызвать функцию-член Display(), наследованную из класса А. //выполняется правильно: A objectA; objectA.Display(); // Display() недоступна). B objectB; objectB.Display(); //???? Display() закрыта в B
можно выборочно квалифицировать один или несколько из наследуемых членов Если вы хотите сделать закрытыми в производном классе только некоторые из наследуемых членов, можно выборочно квалифицировать один или несколько из них. Предположим, вы хотите, чтобы открытый в А целочисленный член x стал закрытым в B, а открытая в А функция Display() осталось бы открытой в B так, чтобы внешние операторы могли ее вызывать. Для этого укажите базовый класс А закрытым в B, как это уже делалось ранее, а в открытой секции В квалифицируйте наследуемые члены, которые вы хотели бы оставит открытыми: //открытый в А член x стал закрытым в B //открытая в А ф-ция Display() //осталось открытой в B class B: private A { public: A::Display; // Выборочно уточнение Display() // Display() осталась открытой // x станет закрытым членом класса В B(): A() { cout << ”Inside B’s constructor\n”; } }; Выражение А::Display; в открытой секции класса В указывает компилятору, что этот член, объявленный в классе А, должен остаться открытым. Наследуемый целочисленный член x станет закрытым членом класса В, как и прежде, однако функция-член Display() останется открытой. Предыдущая попытка вызова Display() для объекта класса В теперь скомпилируется и выполнится правильно: //Теперь правильно! B objectB; objectB.Display(); // Display() – открытый член B в производном классе обычно необходим конструктор, если он определен и в базовом классе
конструктор базового класса должен вызываться, чтобы инициализировать все данные-члены в базовых классах.
В производном классе деструктор нужен только при наличии членов, которые необходимо удалять
ПРИМЕР базового класса
class TBase { private: //указатель basep на строку символов char *basep; public: //создание копии строкового //аргумента в виде динамической // переменной с присвоением адреса // выделенной памяти указателю basep. TBase(const char *s) { basep = strdup(s); } ~TBase() { delete basep; } const char *GetStr(void) { return basep; } }; Класс TBase имеет один защищенный член – указатель basep на строку символов. Конструктор класса вызывает библиотечную функцию strdup() для создания копии строкового аргумента в виде динамической переменной с присвоением адреса выделенной памяти указателю basep. Деструктор-TBase() освобождают этот блок памяти, когда объект типа TBase выходит из области видимости. При создании объекта типа:
// создание объекта TBase president(“George Washington”); //конструктору класса передается //строка “ George Washington ” //создание копии строки и //присваивание ее адреса члену basep //объекта president
//Для отображения строки, //хранящейся в president cout << president. GetStr(); Когда president выходит из области видимости, деструктор класса удаляет строку, хранящуюся в куче. Рис. 3.7. иллюстрирует предоставление president в памяти.
Рис.3.7. Представление объекта
Дата добавления: 2014-01-11; Просмотров: 385; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |