C ++引发方法

时间:2013-10-08 13:55:32

标签: c++

我正在尝试在构造函数中执行raise方法。但是我在SomeMatrix上的metho创建时遇到链接错误。在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);
    }
};

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

SomeMatrix构造函数中,对象的类型为SomeMatrix,因为您尚未启动派生构造函数,因此当您调用虚拟CreateVector函数时,虚拟调度将调用SomeMatrix基类中的一个,但是您没有为此提供定义,因此您会收到链接器错误。

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

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

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