C ++声明对象时可以实现虚方法吗?

时间:2016-08-05 08:45:00

标签: c++ inheritance polymorphism

我很长一段时间以后几乎完全使用Java,所以我回到了使用C ++的时候,所以当我尝试用Java做的事情但我不能用C ++做的事情时,我会遇到障碍。

在这种情况下,在Java中我可以这样做:

public Map<Integer, Warnings> load(
        int maxId, 
        LocalDateTime timestampStart,
        LocalDateTime timestampEnd) {
    return create
            .select(WARNINGS.fields())
            .select(WARNINGS_HISTORY.ID) // Add the ID to the SELECT list
            .from(WARNINGS_HISTORY)
            .innerJoin(WARNINGS).using(WARNINGS.SIDFILENAME)
            .where(WARNINGS_HISTORY.IID.greaterThan(maxId))
            .and(WARNINGS_HISTORY.DTCREATEDATE.greaterOrEqual(timestampStart))
            .and(WARNINGS_HISTORY.DTCREATEDATE.lessOrEqual(timestampEnd))
            .orderBy(WARNINGS_HISTORY.IID.asc())
            .fetchMap(

                // Mapping the Map key is straight forward
                r -> r.get(WARNINGS_HISTORY.ID),

                // Mapping the Map value needs an extra step to avoid the ambiguity
                // between WARNINGS.ID and WARNINGS_HISTORY.ID when you use into(Class),
                // i.e. when you use jOOQ's DefaultRecordMapper
                r -> r.into(WARNINGS).into(Warnings.class)
            );
}   

实质上,我在声明 MyClass 对象时实现 myMethod()的逻辑(注意我的语法可能已关闭)。

我试图找出是否有C ++的等价物

我的特定用例是一组服务器/客户端体系结构的测试,其中Test对象扩展基本的Server / Client抽象类并实现控制其行为的虚拟方法。 我需要为每个特定的测试修改这种行为,并且能够“内联”#34;这些实现在声明Test对象时,而不是必须为每个特定测试在Test对象上实现多个变体。

谢谢!

编辑:我已按照以下方式实施 Smeeheey 的答案,并且像魅力一样

class MyClass
{
   public void myMethod();
}

// -------

MyClass myObject = new MyClass(){
    myMethod()
    {
      // Do stuff
    }
};

}

2 个答案:

答案 0 :(得分:10)

你实际上可以非常接近,使用匿名的本地结构/类:

class MyClass
{
public:
    virtual void doStuff() = 0;
};

void doStuffWithMyStruct(MyClass& s)
{
    s.doStuff();
}

int main()
{
    class: public MyClass
    {
    public:
        void doStuff() override
        {
            std::cout << "Hello" << std::endl;
        }
    } s;

    doStuffWithMyStruct(s);

    return 0;
}

请注意,在上面,变量s具有匿名类型,与Java非常相似。可以通过引用其基本类型来访问其函数。现场演示here

答案 1 :(得分:1)

不,C ++中没有等价物,C ++中常用的类也不存在。

在Java中,这会创建一个新的类类型,它派生自MyClass并覆盖myMethod()。这是有效的,因为MyClass类型的变量只是引用,因此这些变量可以保存对派生类的引用。

在C ++中,MyClass类型的变量不是引用。它们必须是MyClass类型,没有别的。虽然MyClass &可以保存对从MyClass派生的类的引用,但在这种情况下使用引用(或指针)是非常单一的C ++。