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,我搜索了一下,没有发现任何提示,表明在类体中定义(实现)的方法是内联的规则已被标准的更新删除。你能告诉我为什么会这样吗?