这是我的代码:
#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&)
最佳答案
问题在于RMatrix
的add
成员函数与add
中纯虚拟GMatrix
函数的签名不匹配。
您需要的是
GMatrix & RMatrix::add(const GMatrix &)
但是你拥有的是
RMatrix & RMatrix::add(const RMatrix &)
您拥有的函数在概念上与签名不匹配(例如,本段通常与OOP有关,而不仅仅是C++),因为尽管所有
RMatrix
都是GMatrix
,但并非所有GMatrix
都是RMatrix
。这意味着,如果有人进行类似创建扩展FooMatrix
的类GMatrix
的操作,然后创建FooMatrix
和RMatrix
的实例并使用GMatrix
引用来访问它们,则即使RMatrix& RMatrix::add(const RMatrix&)
,他们也将无法使用GMatrix
方法添加两个矩阵。指定必须能够使用调用任何 add
来调用具体子类实现的GMatrix
方法。