Множественное наследование, виртуальные функции
Помогите пожалуйста разобраться...
1. В классах есть переопределенные виртуальные функции класса base. Как сделать так, что бы я мог вызывать эти функции. Например вызвать их из класса name, а не только из publication. Код:
#include "stdafx.h" |
Если рассудок и жизнь дороги вам, держитесь подальше от указателей на char и никогда не используйте их для работы со строковыми значениями
Цитата:
Нет. Ваша программа 1. Выделяет область памяти и сохраняет адрес этой области в значении указателя strname, который является полем класса 2. Заменяет адрес в указателе strname адресом из указателя sname Таким образом указатели strname и sname содержат адрес одного и того же массива символов. Таким образом "изменяя строку strname" вы изменяете и "строку sname". А почему? Да потому что это - не строки, а указатели, говорящие "объект находится там". Более того, при этом область памяти, выделенная командой "strname=new char[256]", безвозвратно теряется, поскольку нет ни одного указателя, хранящего её адрес. Эту память нельзя будет освободить иначе, как прекратив выполнение программы. Работа со строковыми значениями через указатели на символы производится через специальные функции, и это - крайне сложная задача, требующая тщательнейшего понимания сути выполняемых действий и строжайшего самоконтроля. Посему для работы со строками можно использовать только классы строковых контейнеров - string, AnsiString и т.д. А char* - только там, где это действительно требуется для достижения максимальной производительности вычислений. |
Теперь вернусь к основному вопросу
Цитата:
Таким образом имена "виртуальных" методов можно спокойно использовать в любом классе, в котором этот метод уже определён (пусть даже "абстрактно"). И нет разницы, производится ли вызов из другого метода данного класса (командой this->VM(); ) или же извне по указателю базового класса (командой TBaseClass->VM(); ). В обоих случаях механизм виртуальных функций определит настоящий класс данного объекта и вызовет соответствующую реализацию для данного уровня. P.S. Для того, чтобы вызвать конкретную реализацию виртуальной функции из базового класса (например, чтобы выполнить все реализации по цепочке), нужно написать команду так TBaseClass:VM(); |
Время: 18:48. |
Время: 18:48.
© OSzone.net 2001-