• 16157阅读
  • 10回复

[提问]关于父类与子类(基类)的关系吧 [复制链接]

上一主题 下一主题
离线z55716368
 

只看楼主 倒序阅读 楼主  发表于: 2015-06-09
回复本帖可获得1RMB金钱奖励!
每人最多可获奖2次,奖池剩余9RMB金钱 (中奖几率10%)
老大叫定义一个父类CDevice,包括几个函数,然后在子类CSerialport中吧这几个函数重载。
问题1:这个父类只需要一个.h文件就可以了么,貌似只是把函数写进去不需要进行定义
问题2:我子类应该如何写呢?比如父类有void A();void B();void C(),3个函数还有一个信号void whetherReceive();一个槽函数void receiveData();
           子类的话要如何去重载呢。
主要就这2个问题,希望看到的朋友给一些思路,最好给几句代码让我参考一下,新人一个 十分感谢!
每一个问题 都是一次进步
离线lemonzll

只看该作者 1楼 发表于: 2015-06-09
回帖奖励+ 1
class CDevice : public QObject
{
    Q_OBJECT
public:
    CDevice(QObject *parent = 0): QObject(parent) {}
    ~CDevice() {}

    virtual void A() = 0;
    virtual void B() = 0;
    virtual void C() = 0;

signals:
    void whetherReceive();
public slots:
    virtual void receiveData() = 0;
};

class CustomDevice: public CDevice
{
    Q_OBJECT
public:
    CustomDevice(QObject *parent = 0): CDevice(parent) {}
    ~CustomDevice() {}

    void A() {qDebug() << "A";}
    void B() {qDebug() << "B";}
    void C() {qDebug() << "C";}
public slots:
    void receiveData() {
        qDebug() << "receive data";
        emit whetherReceive();
    }
};
这是比较基础的C++的,你可以查下纯虚函数
离线stlcours

只看该作者 2楼 发表于: 2015-06-09
1. 编译的时候,可能只需要.h。但是连接的时候仍然需要cpp的。也许有办法投机取巧,但是建议你写全了,不要偷懒。
2. 父类应该定义 virtual void A(); virtual void B(); 子类直接起同名函数即可virtual void A();(其中子类virtual关键字可省略,效果一样),另外这不叫子类重载,叫子类覆盖。
离线z55716368

只看该作者 3楼 发表于: 2015-06-10
回 lemonzll 的帖子
lemonzll:class CDevice : public QObject
{
    Q_OBJECT
public:
    CDevice(QObject *parent = 0): QObject(parent) {}
....... (2015-06-09 17:21) 

写的很详细,关于在子类重载或者说是覆盖那些函数的时候,可以在.h中申明然后去cpp中实现吧?
CustomDevice(QObject *parent = 0): CDevice(parent) {}这一句应该这样吗CustomDevice(QObject *parent = 0, CDevice *device = 0);和你的这种写法有什么区别?
每一个问题 都是一次进步
离线z55716368

只看该作者 4楼 发表于: 2015-06-10
回 stlcours 的帖子
stlcours:1. 编译的时候,可能只需要.h。但是连接的时候仍然需要cpp的。也许有办法投机取巧,但是建议你写全了,不要偷懒。
2. 父类应该定义 virtual void A(); virtual void B(); 子类直接起同名函数即可virtual void A();(其中子类virtual关键字可省略,效果一样),另外这不叫子类重载 .. (2015-06-09 17:21) 

能把1.详细说明一下吗,有点似懂非懂的感觉 谢谢
每一个问题 都是一次进步
离线lemonzll

只看该作者 5楼 发表于: 2015-06-11
回 z55716368 的帖子
z55716368:写的很详细,关于在子类重载或者说是覆盖那些函数的时候,可以在.h中申明然后去cpp中实现吧?
CustomDevice(QObject *parent = 0): CDevice(parent) {}这一句应该这样吗CustomDevice(QObject *parent = 0, CDevice *device = 0);和你的这种写法有什么区别? (2015-06-10 16:16)

是可以在.h中声明然后cpp中实现,也最好这样做。上面的例子是全写在.h里面了,就不需要有cpp文件。你问的那个函数是构造函数,专门用于类的初始化的,最好按我写的形式写,直接调用父类的构造函数。冒号后面的叫初始化列表,一般调用父类的构造函数这样写的
离线z55716368

只看该作者 6楼 发表于: 2015-06-11
回 lemonzll 的帖子
lemonzll:是可以在.h中声明然后cpp中实现,也最好这样做。上面的例子是全写在.h里面了,就不需要有cpp文件。你问的那个函数是构造函数,专门用于类的初始化的,最好按我写的形式写,直接调用父类的构造函数。冒号后面的叫初始化列表,一般调用父类的构造函数这样写的
 (2015-06-11 08:13) 

谢谢回复 感觉很有用
每一个问题 都是一次进步
离线z55716368

只看该作者 7楼 发表于: 2015-06-11
回 lemonzll 的帖子
lemonzll:
是可以在.h中声明然后cpp中实现,也最好这样做。上面的例子是全写在.h里面了,就不需要有cpp文件。你问的那个函数是构造函数,专门用于类的初始化的,最好按我写的形式写,直接调用父类的构造函数。冒号后面的叫初始化列表,一般调用父类的构造函数这样写的


按照我的想法我这样写了2个 不过在new子类的时候会弹出错误error: invalid new-expression of abstract class type 'CSerialport',麻烦你帮我看看 谢谢
描述:父类
附件: driverinterface.h (1 K) 下载次数:2
描述:实例化对象
附件: mainwindow.cpp (4 K) 下载次数:2
描述:申明子类指针
附件: mainwindow.h (1 K) 下载次数:2
描述:子类
附件: serialport.cpp (4 K) 下载次数:2
描述:子类
附件: serialport.h (2 K) 下载次数:2
每一个问题 都是一次进步
离线lemonzll

只看该作者 8楼 发表于: 2015-06-11
回 z55716368 的帖子
z55716368:按照我的想法我这样写了2个 不过在new子类的时候会弹出错误error: invalid new-expression of abstract class type 'CSerialport',麻烦你帮我看看 谢谢 (2015-06-11 08:54) 

大致看了下,你说的提示那个错误意思是子类没有实现父类所有的纯虚函数,这样你这个子类就不能实例化的。你子类和父类的函数定义是不同的,这样子不行,你如果要实现那几个纯虚函数,函数定义必须一样的,返回值、函数名字、参数都需要一样,你现在那写法是参数不一样,这样就变成函数重载了。子类要能实例化必须实现所有的纯虚函数。
离线z55716368

只看该作者 9楼 发表于: 2015-06-11
回 lemonzll 的帖子
lemonzll:大致看了下,你说的提示那个错误意思是子类没有实现父类所有的纯虚函数,这样你这个子类就不能实例化的。你子类和父类的函数定义是不同的,这样子不行,你如果要实现那几个纯虚函数,函数定义必须一样的,返回值、函数名字、参数都需要一样,你现在那写法是参数不一样,这样就变 .. (2015-06-11 09:41) 

哦  我在按照你的说法改一下试试 保持函数申明一致就可以了吧 因为我的父类没有定义只是申明
每一个问题 都是一次进步
离线z55716368

只看该作者 10楼 发表于: 2015-06-11
回 lemonzll 的帖子
lemonzll:大致看了下,你说的提示那个错误意思是子类没有实现父类所有的纯虚函数,这样你这个子类就不能实例化的。你子类和父类的函数定义是不同的,这样子不行,你如果要实现那几个纯虚函数,函数定义必须一样的,返回值、函数名字、参数都需要一样,你现在那写法是参数不一样,这样就变 .. (2015-06-11 09:41) 

修改之后保持了返回值 函数名字 参数的一致性,然后就可以运行了 十分感谢你的帮助 谢谢!
每一个问题 都是一次进步
快速回复
限100 字节
 
上一个 下一个