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

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

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

Сообщений: 2812


Просмотр профиля
« : Июнь 11, 2009, 14:24 »

Доброго времени суток!

Тут столкнулся с одной непоняткой:

есть базовый класс:
Код:
class TBaseSerialDevice : public QIODevice
{
...
public:
....
    virtual bool setBaudRate(TBaudRate baudRate=BaudRate9600) { parameters->m_baudRate=baudRate; return true; }
    bool setBaudRate(const QString &baudRate) { return setBaudRate(maps->baudRateMap.key(baudRate)); } //перегружаемая функция
....
private:
    MyType parameters; //упрощенно
    QMap<int, QString> baudRateMap; //упрощенно
}

есть наследник от TBaseSerialDevice
Код:
class TWinSerialDevice : public TBaseSerialDevice
{
....
    bool setBaudRate(TBaudRate baudRate); {//тут уже другая реализация нежели в TBaseSerialDevice т.е я переопределяю эту виртуальную ф-ю }
....
}

и при комниляции в том месте где main.cpp вызывается этот метод  bool TWinSerialDevice::setBaudRate(const QString &baudRate)
пишет:
Цитировать
....
main.cpp:32: error: no matching function for call to `TWinSerialDevice::setBaudRate(QString&)'
../../src/winserialdevice.h:18: note: candidates are: virtual bool TWinSerialDevice::setBaudRate(TBa
seSerialDevice::TBaudRate)
....

Почему нет точки вызова функции bool TWinSerialDevice::setBaudRate(const QString &baudRate) Непонимающий ведь TWinSerialDevice должна унаследовать от TBaseSerialDevice этот метод !!! о_О
« Последнее редактирование: Июнь 11, 2009, 14:43 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Июнь 11, 2009, 14:29 »

А покажи код main.cpp
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Июнь 11, 2009, 14:39 »

вот
Код:
/*
\en Test application to default parameters
\ru Тестовое приложение для параметров по умолчанию
*/

#include <QtCore>
#include <winserialdevice.h>

class TWinSerialDevice;

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    TWinSerialDevice *MyDevice;

    MyDevice = new TWinSerialDevice();

    qDebug() << "= Defaults parameters =" ;
    qDebug() << "Device name        : " << MyDevice->deviceName() ;
    qDebug() << "Baud rate          : " << MyDevice->baudRate() ;
    qDebug() << "Data bits          : " << MyDevice->dataBits() ;
    qDebug() << "Parity              : " << MyDevice->parity() ;
    qDebug() << "Stop bits          : " << MyDevice->stopBits() ;
    qDebug() << "Flow                : " << MyDevice->flowControl() ;
    qDebug() << "Char timeout, msec  : " << MyDevice->charIntervalTimeout() ;
//
    MyDevice->setDeviceName("COM1") ;

MyDevice->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
QString br="115200 baud";
    MyDevice->setBaudRate(br) ;  //  <==== тут строка 32
    MyDevice->setDataBits("7 bit") ;
    MyDevice->setParity("Even") ;
    MyDevice->setStopBits("2") ;
    MyDevice->setFlowControl("Hardware") ;
    MyDevice->setCharIntervalTimeout(100) ;
//
    qDebug() << "= New parameters =" ;
    qDebug() << "Device name        : " << MyDevice->deviceName() ;
    qDebug() << "Baud rate          : " << MyDevice->baudRate() ;
    qDebug() << "Data bits          : " << MyDevice->dataBits() ;
    qDebug() << "Parity              : " << MyDevice->parity() ;
    qDebug() << "Stop bits          : " << MyDevice->stopBits() ;
    qDebug() << "Flow                : " << MyDevice->flowControl() ;
    qDebug() << "Char timeout, msec  : " << MyDevice->charIntervalTimeout() ;

MyDevice->close();

    return app.exec();
}

Записан

ArchLinux x86_64 / Win10 64 bit
roman.ks
Гость
« Ответ #3 : Июнь 11, 2009, 14:47 »

Код:
class TWinSerialDevice : public TBaseSerialDevice
{
....
    bool setBaudRate(TBaudRate baudRate); {//тут уже другая реализация нежели в TBaseSerialDevice т.е я переопределяю эту виртуальную ф-ю }
....
}

Область видимости setBaudRate public ?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Июнь 11, 2009, 14:49 »

Улыбающийся да, public
Записан

ArchLinux x86_64 / Win10 64 bit
spirit
Гость
« Ответ #5 : Июнь 11, 2009, 14:52 »

не в тему конечно, но кто будет удалять MyDevice?  Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Июнь 11, 2009, 14:54 »

Цитировать
не в тему конечно, но кто будет удалять MyDevice?  Улыбающийся

а если в тему?

Местные ГУРУ обращают не на то внимание свое!!! Улыбающийся 
Записан

ArchLinux x86_64 / Win10 64 bit
roman.ks
Гость
« Ответ #7 : Июнь 11, 2009, 14:57 »

bool setBaudRate(TBaudRate baudRate  <----! );

а передаете строку!
Записан
roman.ks
Гость
« Ответ #8 : Июнь 11, 2009, 14:58 »

ой, все, ерунду несу
Записан
roman.ks
Гость
« Ответ #9 : Июнь 11, 2009, 15:00 »

А что за компилятор?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Июнь 11, 2009, 15:01 »

minGW
Записан

ArchLinux x86_64 / Win10 64 bit
roman.ks
Гость
« Ответ #11 : Июнь 11, 2009, 15:07 »

А если попробовать заменить
TWinSerialDevice *MyDevice; на
TBaseSerialDevice *MyDevice;

При условии, что ниже не вызываются специфичные для TWinSerialDevice  методы. Скомпилируется?
Записан
sermp
Гость
« Ответ #12 : Июнь 11, 2009, 15:19 »

Если я ничего не путаю, то объявление bool TWinSerialDevice::setBaudRate(TBaudRate baudRate); перекрывает все определения  setBaudRate класса TBaseSerialDevice. Т.е. если Вы хотите, чтобы в классе TWinSerialDevice был метод  bool setBaudRate(const QString &baudRate), то Вам придётся её переписать для этого класса.

к сожалению, не могу сейчас дать пруф-линк и надеюсь, что я ничего не напутал.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #13 : Июнь 11, 2009, 16:49 »

http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/575631e6ba581ee6/d4e4c36db398d560?hl=ru&q=overloading+overriding+hiding

твой случай это hiding, когда метода с другой сигнатурой в наследнике прячет метод базового класса. Вызывать надо явно указав область видимости:

Код
C++ (Qt)
MyDevice->TBaseSerialDevice::setBaudRate(br);
Записан
Barmaglodd
Гость
« Ответ #14 : Июнь 13, 2009, 14:18 »

http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/575631e6ba581ee6/d4e4c36db398d560?hl=ru&q=overloading+overriding+hiding

твой случай это hiding, когда метода с другой сигнатурой в наследнике прячет метод базового класса. Вызывать надо явно указав область видимости:

Код
C++ (Qt)
MyDevice->TBaseSerialDevice::setBaudRate(br);
Это не то, внимательнее почитайте свою ссылку и код в первом посте. У kuzulis'а  всё в public лежит.

@kuzulis: Давай весь код TWinSerialDevice и TBaseSerialDevice и полный текст ошибки компилятора.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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