C ++抽象类不能有一个带有该类参数的方法

时间:2010-11-26 01:45:51

标签: c++

我创建了这个.h文件

#pragma once

namespace Core
{
    class IComparableObject
    {
    public:
            virtual int CompareTo(IComparableObject obj)=0;
    };
}

但是如果方法是虚拟纯的,编译器不喜欢 IComparableObject obj 参数,而

virtual int CompareTo(IComparableObject obj) {}

没关系,但我希望它是虚拟的纯粹。我怎么能设法做到这一点?有可能吗?

4 个答案:

答案 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引用传递。