Название: Виртуальные методы. Наследование. Простой вопрос. Отправлено: kuzulis от Ноябрь 04, 2009, 11:24 Доброго времени!
Мне некогда разбираться с С++ вот в таком плане: Имеется к примеру некий класс в котором объявлен виртуальный метод Код: class Base Далее, я создаю другой класс, наследник от Base и в нем переопределяю метод: Код: class A : public Base Далее я создаю экземпляр класа А и вызываю метод read() Вопрос: что вернет метод read: 3 или 4 ? :) Код: ... Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: BRE от Ноябрь 04, 2009, 11:26 Вопрос: что вернет метод read: 3 или 4 ? :) 3Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: kuzulis от Ноябрь 04, 2009, 11:28 Почему?
Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: BRE от Ноябрь 04, 2009, 11:30 Почему? Так время разобраться все таки есть? ;)Потому что это разные методы, один с параметром, а второй без. Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: lit-uriy от Ноябрь 04, 2009, 11:32 >>Вопрос: что вернет метод read: 3 или 4 ?
а скомпилить и проверить слабо? Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: kuzulis от Ноябрь 04, 2009, 11:32 Так у второго параметр по умолчанию то = 4 !
т.е мне нужно чтобы возвратило 4. А вот так я имею право сделать: ? Код: class A : public Base Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: Rcus от Ноябрь 04, 2009, 11:33 это для человека имя метода одно, а для компилятора это разные методы /а для компоновщика они вообще не связаны :)/
Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: BRE от Ноябрь 04, 2009, 11:33 Так у второго параметр по умолчанию то = 4 ! Но параметр есть. Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: lit-uriy от Ноябрь 04, 2009, 11:35 >>наследник от Base и в нем переопределяю метод:
ты его не переопределил, а перегрузил. Когда переопределяют, повторяют сигнатуру - имя функции и аргументы. int myFunc(Type1 arg1, Type2 arg2) выделенное жирным - сигнатура Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: kuzulis от Ноябрь 04, 2009, 11:36 А так как в ответе №5 я могу поступить?
Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: BRE от Ноябрь 04, 2009, 11:37 А так как в ответе №5 я могу поступить? А так компилятор тебя не поймет. ;)Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: kuzulis от Ноябрь 04, 2009, 11:39 А как тогда?
Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: BRE от Ноябрь 04, 2009, 11:43 А как тогда? А чего ты хочешь добиться?Код
или Код
или .... Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: lit-uriy от Ноябрь 04, 2009, 11:46 походу я лишнего выделил, имя функции не входит в понятие сигнатуры.
int myFunc(Type1 arg1, Type2 arg2) Т.е. следующие три функции имеют одинаковую сигнатуру: Код
Т.е. следующие две функции одноимённые и с одинаковой сигнатурой: Код тогда при вызове getData(), без параметров, компилятор не может понять какую из них он должен вызывать Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: kuzulis от Ноябрь 04, 2009, 12:22 Цитировать А чего ты хочешь добиться? Того, чтобы метод read() в классе А использовал внутри себя метод getData(int), а не тот метод getData(), который реализован в базовом классе Base !Изменить реализацию метода read() в базовом классе я не могу, т.к. это метод из QIODevice, который я не перепишу. Я могу изменить только виртуальный метод getData() (рально это - QIODevice::bytesAvailable()) , который используется в методе QIODevice::read() - НО сигнатура метода getData() должна быть не getData() а getData(int) (рально это - QIODevice::bytesAvailable(int)) :) т.е. в реале нужно чтобы при вызове QIODevice::read() - внутри нее вызывался мой метод QIODevice::bytesAvailable(int) Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: kuzulis от Ноябрь 04, 2009, 12:55 Цитировать Т.е. следующие две функции одноимённые и с одинаковой сигнатурой: Код C++ (Qt) int getData() int getData(int data = 4) тогда при вызове getData(), без параметров, компилятор не может понять какую из них он должен вызывать почему одинаковые? ведь у одной входной параметр типа void - а у другой типа int . Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: lit-uriy от Ноябрь 04, 2009, 14:52 >>ведь у одной входной параметр типа void - а у другой типа int
ты путаешь Си++ с Си, нет void'а. просто нет аргумента. А у другой, есть умалчиваемое значение, обе вызываются так: getData() и getData() какая из них вызывается? Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: lit-uriy от Ноябрь 04, 2009, 14:55 Цитировать т.е. в реале нужно чтобы при вызове QIODevice::read() - внутри нее вызывался мой метод QIODevice::bytesAvailable(int) QIODevice::bytesAvailable(int) - нет такого метода у QIODevice Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: lit-uriy от Ноябрь 04, 2009, 14:57 >>Того, чтобы метод read() в классе А использовал внутри себя метод getData(int),
так не получится Название: Re: Виртуальные методы. Наследование. Простой вопрос. Отправлено: kuzulis от Ноябрь 04, 2009, 15:02 Цитировать QIODevice::bytesAvailable(int) - нет такого метода у QIODevice Да, нету, его я сам реализую. Хотя... я понял что мне нужно делать... Парни - всем спасибо! :) |