我创建了这个.h文件
#pragma once
namespace Core
{
class IComparableObject
{
public:
virtual int CompareTo(IComparableObject obj)=0;
};
}
但是如果方法是虚拟纯的,编译器不喜欢 IComparableObject obj 参数,而
virtual int CompareTo(IComparableObject obj) {}
没关系,但我希望它是虚拟的纯粹。我怎么能设法做到这一点?有可能吗?
答案 0 :(得分:26)
您正在尝试按值传递obj
。您不能按值传递抽象类实例,因为不能直接实例化抽象类(直接)。要做你想做的事,你必须通过引用传递obj
,例如:
virtual int CompareTo(IComparableObject const &obj)=0;
当你为CompareTo
提供实现时,它会起作用,因为那时类不再是抽象的了。但请注意slicing发生!您不希望按值传递obj
。
答案 1 :(得分:8)
答案 2 :(得分:2)
当CompareTo
成员函数是纯虚拟时,IComparableObject
是一个抽象类。
您无法直接复制抽象类的对象。
当您按值传递对象时,您将直接复制该对象。
您可以通过引用传递给const
。
即形式参数类型IComparableObject const&
。
顺便说一下,函数应该声明为const
,以便可以在const
对象上调用它。
此外,代替#pragma once
,这是非标准的(但大多数编译器都支持),考虑一个普通的包含守卫。
此外,在发布说明问题的代码时,请务必发布确切的代码。在这种情况下,最后会有一个缺少的分号,表示手动输入代码(因此可能存在其他拼写错误,因此不能轻易识别,而是错误地将其识别为问题的一部分)。只需复制并粘贴实际代码。
干杯&第h。,
答案 3 :(得分:2)
来自C ++ 03,§10.43:
抽象类不能用作参数类型,函数返回类型或显式转换的类型。可以声明指针和对抽象类的引用。
允许将obj
作为const引用传递。