这是我的代码:

#include <cstdlib>
#include <vector>
#include <iostream>
#include <cstring>

using namespace std;
//abstract class
class GMatrix {
    string name;
    int nrows;
    int ncols;
public:
    GMatrix(const string & n, int nr, int nc);
     virtual GMatrix& add(const GMatrix&)= 0;
};

class RMatrix : public GMatrix {
    vector<int>numbers;
public:
    RMatrix(const string & n, int nr, int nc, vector<int> nums);
    RMatrix& add(const RMatrix&);
};

GMatrix::GMatrix(const string& n, int nr, int nc){
    name=n;
    nrows=nr;
    ncols=nc;
}

RMatrix::RMatrix(const string & n,int nr, int nc, vector<int> nums):GMatrix(n,nr,nc){
    numbers=numbers;
}

RMatrix& RMatrix::add(const RMatrix& x){
    for(int i =0; i = numbers.size(); i++){
        numbers.at(i)+=x.numbers.at(i);
    }
}

int main(int argc, char** argv) {
    vector<int> n;
    for (int i = 0; i < 16 ; i++){
        n.push_back(i);
    }

    RMatrix a("a",4,4,n);
    return 0;
}

如您所见,我的程序由两个类组成,一个类(父类)是抽象类,因此这里的方法没有功能,一个子类。我的问题是无法构建此代码。我尝试将对象a创建为RMatrix对象,但是编译器显示了我不理解的错误:
main.cpp:48:13: error: cannot declare variable ‘a’ to be of abstract type ‘RMatrix’
main.cpp:18:7: note:   because the following virtual functions are pure within ‘RMatrix’:
main.cpp:15:23: note:   virtual GMatrix& GMatrix::add(const GMatrix&)

最佳答案

问题在于RMatrixadd成员函数与add中纯虚拟GMatrix函数的签名不匹配。

您需要的是

GMatrix & RMatrix::add(const GMatrix &)

但是你拥有的是
RMatrix & RMatrix::add(const RMatrix &)

您拥有的函数在概念上与签名不匹配(例如,本段通常与OOP有关,而不仅仅是C++),因为尽管所有RMatrix都是GMatrix,但并非所有GMatrix都是RMatrix。这意味着,如果有人进行类似创建扩展FooMatrix的类GMatrix的操作,然后创建FooMatrixRMatrix的实例并使用GMatrix引用来访问它们,则即使RMatrix& RMatrix::add(const RMatrix&),他们也将无法使用GMatrix方法添加两个矩阵。指定必须能够使用调用任何 add来调用具体子类实现的GMatrix方法。

10-08 07:36