C++ C++;继承-引用类型的初始化无效

C++ C++;继承-引用类型的初始化无效,c++,inheritance,C++,Inheritance,我编写了以下代码: class DoubleClass; class IntClass; class Number { public: virtual Number& addInt(IntClass& x)=0; virtual Number& addDouble(DoubleClass& x)=0; virtual Number& operator+(Number& x) = 0; }; class IntClass

我编写了以下代码:

class DoubleClass;
class IntClass;

class Number {
public:
    virtual Number& addInt(IntClass& x)=0;
    virtual Number& addDouble(DoubleClass& x)=0;
    virtual Number& operator+(Number& x) = 0;
};

class IntClass : public Number {
private:
    int num;
public:
    IntClass(int num) : num(num) { }
    Number& addInt(IntClass& x) { return x; }
    **Number& addDouble(DoubleClass& x) { return x; }**
    Number& operator+(Number& x) { return x; }
};

class DoubleClass: public Number {
private:
    double num;
public:
    DoubleClass(double num) : num(num) {}
    double get_number() { return num; }
    Number& addInt(IntClass& x) {
        return x;
    }
    Number& addDouble(DoubleClass& x) { return x; }
    Number& operator+(Number& x) { return x; }
};
谢谢迭戈·塞维利亚,我照你说的做了,成功了。 还有一个问题,我要写函数: 编号和添加(编号和x、编号和y)
实现它的唯一方法是对所有可能的x和y进行动态转换(将x和y转换为int,如果抛出异常,则将x转换为double,将y转换为double,等等),还是有更简单的方法?

您还没有定义
DoubleClass
,因此,除了获取对象的地址并传递它之外,您不能对引用执行任何操作。

此时编译器不知道
DoubleClass
继承自
Number
。您应该将类声明和方法实现分开。例如:

class IntClass : public Number {
// ...

  Number& addDouble(DoubleClass& x); // Note: no implementation
};

class DoubleClass : public Number
{
// ...
};

inline Number& IntClass::addDouble(DoubleClass& x) { return x; } // Won't fail now

addDouble()
实现中使用
inline
,将使方法保持内联。我认为,对于体内实现,这是默认的,尽管我不确定。是的,您也可以添加
inline
。然而,现在的内联与在类主体内部定义无关。@Tilman是对的。为了将其保留在标题中,您实际上必须将
内联
放在那里以避免链接器错误。啊,Johannes,您是对的。但是,我没有指定实现的位置。我正在添加它,因为它似乎进入了头文件。@Diego,我搜索了一下,没有发现任何提示,表明在类体中定义(实现)的方法是
内联的规则已被标准的更新删除。你能告诉我为什么会这样吗?