Russian Qt Forum

Программирование => С/C++ => Тема начата: kuzulis от Ноябрь 04, 2009, 11:24



Название: Виртуальные методы. Наследование. Простой вопрос.
Отправлено: kuzulis от Ноябрь 04, 2009, 11:24
Доброго времени!

Мне некогда разбираться с С++ вот в таком плане:
Имеется к примеру некий класс в котором объявлен виртуальный метод
Код:
class Base
{
public:
    void int read() { return getData(); }
    virtual int getData() const { return 3}
}

Далее, я создаю другой класс, наследник от Base и в нем переопределяю метод:
Код:
class A : public Base
{
public:
    virtual int getData(int data = 4) const { return data;}
}

Далее я создаю экземпляр класа А и вызываю метод read()

Вопрос: что вернет метод read:  3 или 4 ? :)

Код:
...
A *a = new A;
...
qDebug() << " ret = " << a->read();
...


Название: 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
{
public:
    virtual int getData() const { return getData(4); }
    virtual int getData(int data = 4) const { return data;}
}


Название: 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
А как тогда?
А чего ты хочешь добиться?

Код
C++ (Qt)
int Base::getData() const { return 3; }
int A::getData() const { return 4; }
 

или

Код
C++ (Qt)
int Base::getData() const { return m_data; }
// А m_data настраивается другим методом
 

или ....


Название: Re: Виртуальные методы. Наследование. Простой вопрос.
Отправлено: lit-uriy от Ноябрь 04, 2009, 11:46
походу я лишнего выделил, имя функции не входит в понятие сигнатуры.
int myFunc(Type1 arg1, Type2 arg2)

Т.е. следующие три функции имеют одинаковую сигнатуру:
Код
C++ (Qt)
int myFunc(Type1 arg1, Type2 arg2)
int myFunc(Type1 arg1, Type2 arg2=0)
void myFunc(Type1 arg1, Type2 arg2)

Т.е. следующие две функции одноимённые и с одинаковой сигнатурой:
Код
C++ (Qt)
int getData()
int getData(int data = 4)
тогда при вызове 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

Да, нету, его я сам реализую.

Хотя... я понял что мне нужно делать...

Парни - всем спасибо! :)