Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++继承虚拟函数实现_C++_Qt - Fatal编程技术网

C++继承虚拟函数实现

C++继承虚拟函数实现,c++,qt,C++,Qt,如果我要从一个类继承,我必须定义它的所有虚函数和纯虚函数吗 例如,我有一个从QabstractemModel继承的派生类。QabstracteModel具有以下纯虚拟函数。如果我的派生类不打算使用index和parent方法,我需要实现它吗 //qabstractitemmodel.h virtual QModelIndex index(int row, int column, const QModelIndex &parent

如果我要从一个类继承,我必须定义它的所有虚函数和纯虚函数吗

例如,我有一个从QabstractemModel继承的派生类。QabstracteModel具有以下纯虚拟函数。如果我的派生类不打算使用index和parent方法,我需要实现它吗

//qabstractitemmodel.h
virtual QModelIndex index(int row, int column,
                              const QModelIndex &parent = QModelIndex()) const = 0;
virtual QModelIndex parent(const QModelIndex &child) const = 0;
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0;
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0;

您根本不必在派生类中实现任何东西,但该派生类仍然是抽象的,如果您将任何纯虚拟成员函数保留在没有实现的情况下,换句话说,您将无法实例化该类的对象

编辑: 如果你的基类包含你的派生类不需要的纯虚函数,那么值得考虑的另一个设计是什么?可能使用多个基类来声明接口的不同部分


如果index和parent不适用于qabstractemmodel的所有派生类,那么我认为这些函数可能不属于qabstractemmodel,实际上

您不必在派生类中实现任何东西,但是这个派生类仍然是抽象的,如果您没有实现任何纯虚拟成员函数,换句话说,您将无法实例化该类的对象

编辑: 如果你的基类包含你的派生类不需要的纯虚函数,那么值得考虑的另一个设计是什么?可能使用多个基类来声明接口的不同部分


如果index和parent不适用于qabstractemmodel的所有派生类,那么我认为这些函数可能不属于qabstractemmodel真正的

是的。将方法声明为纯虚拟“=0”意味着可以实例化的任何具体子类都必须实现它们。

是。将方法声明为纯虚拟“=0”意味着可以实例化的任何具体子类都必须实现它们。

-是的,如果要实例化派生类,则必须在派生类中定义纯虚拟函数。QabstracteModel不提供索引或父级的定义,因此您需要提供自己的定义。如果它确实提供了实现,您可以从子类调用基类的版本。可能的重复-是的,如果要实例化该类,您必须在派生类中定义纯虚拟函数。QabstracteModel不提供索引或父级的定义,因此您需要提供自己的定义。如果它提供了实现,你可以从你的子类调用基类的版本。可能的重复我见过它,因为规范已经更改,并且创建了新的类,一个派生类被故意忽略在基类中。虽然可以对过期的派生类调用基类函数,但没有任何效果。这一切都取决于您的总体设计。这还不错,只是不理想。我见过这样的情况:由于规范发生了变化,创建了新的类,所以派生类故意与基类一起过时。虽然可以对过期的派生类调用基类函数,但没有任何效果。这一切都取决于您的总体设计。不坏,只是不理想。