Russian Qt Forum
Ноябрь 18, 2024, 20:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Виртуальные методы. Наследование. Простой вопрос.  (Прочитано 10613 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Ноябрь 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();
...
Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #1 : Ноябрь 04, 2009, 11:26 »

Вопрос: что вернет метод read:  3 или 4 ? Улыбающийся
3
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Ноябрь 04, 2009, 11:28 »

Почему?
Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #3 : Ноябрь 04, 2009, 11:30 »

Почему?
Так время разобраться все таки есть?  Подмигивающий

Потому что это разные методы, один с параметром, а второй без.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Ноябрь 04, 2009, 11:32 »

>>Вопрос: что вернет метод read:  3 или 4 ?
а скомпилить и проверить слабо?

« Последнее редактирование: Ноябрь 04, 2009, 11:34 от lit-uriy » Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Ноябрь 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;}
}
« Последнее редактирование: Ноябрь 04, 2009, 11:35 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #6 : Ноябрь 04, 2009, 11:33 »

это для человека имя метода одно, а для компилятора это разные методы /а для компоновщика они вообще не связаны Улыбающийся/
Записан
BRE
Гость
« Ответ #7 : Ноябрь 04, 2009, 11:33 »

Так у второго параметр по умолчанию то = 4 !
Но параметр есть.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Ноябрь 04, 2009, 11:35 »

>>наследник от Base и в нем переопределяю метод:
ты его не переопределил, а перегрузил.
Когда переопределяют, повторяют сигнатуру - имя функции и аргументы.

int myFunc(Type1 arg1, Type2 arg2)
выделенное жирным - сигнатура
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Ноябрь 04, 2009, 11:36 »

А так как в ответе №5 я могу поступить?
Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #10 : Ноябрь 04, 2009, 11:37 »

А так как в ответе №5 я могу поступить?
А так компилятор тебя не поймет.  Подмигивающий
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Ноябрь 04, 2009, 11:39 »

А как тогда?
Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #12 : Ноябрь 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 настраивается другим методом
 

или ....
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Ноябрь 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(), без параметров, компилятор не может понять какую из них он должен вызывать
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #14 : Ноябрь 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)
« Последнее редактирование: Ноябрь 04, 2009, 12:30 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.115 секунд. Запросов: 23.