-3

我正在尝试在我的构造函数中执行 raise 方法。但是我在 SomeMatrix 中创建方法时遇到链接错误。在 UsualMatrix 和 ThinMatrix 构造函数中,不同之处仅在于向量的类型。

class SomeMatrix: public IMatrix
{

public:
    virtual IVector* CreateVector(int _length)=0;

    SomeMatrix(int _rows,int _cols)
    {
        cols = _cols;
        rows = _rows;
        values = new IVector*[rows];
        for (int i=0;i<rows;i++)
        {
            values[i] = CreateVector(cols);
        }
    }
};

class UsualMatrix:public SomeMatrix
{
public:
    IVector* CreateVector(int _length)
    {
        return new UsualVector(_length);
    }
};

class ThinMatrix:public SomeMatrix
{
public:
    IVector* CreateVector(int _length)
    {
        return new ThinVector(_length);
    }
};
4

2 回答 2

1

在基类构造函数中调用虚函数来拉取派生类的信息是根本错误的,没有办法做到这一点!

于 2013-10-08T14:05:02.473 回答
0

SomeMatrix构造函数中,对象的类型是SomeMatrix因为你还没有启动派生构造函数,所以当你调用虚CreateVector函数时,虚拟调度调用SomeMatrix基类中的那个,但你还没有为此提供定义,所以你得到一个链接器错误。

您可以通过在类外部提供定义来解决链接器错误:

IVector* SomeMatrix::CreateVector(int _length)
{
  // ...
}

但是,这不会做你想要的。无法从基类构造函数(或基类析构函数)调用派生类的虚拟成员函数。

于 2013-10-08T14:29:40.367 回答