2011-12-01 123 views
2

我是C++新手,我用Java编码了一年。接口和抽象类的C++中的等价物只是抽象类。这是否应该是工厂设计时的一个障碍?有很多时候我想省略继承类的定义方法,我想强制执行它。C++抽象类

+3

C++中的任何内容都不成为障碍。 –

回答

8

Java接口最好翻译成C++抽象类。在Java中(据我所知),接口只是抽象类的一个子集,只是它允许C++在所有情况下都具有“多重继承”。

class thing_interface { 
public: 
    virtual ~thing_interface() {} 
    virtual void foo() =0; //pure virtual function 
}; 
class other_interface { 
public: 
    virtual ~other_interface() {} 
    virtual void bar() =0; //pure virtual function 
}; 

class thing_impl : public thing_interface, public other_interface { 
protected: 
    int member; 
public: 
    thing_impl() : member(0) {} 
    virtual ~thing_impl() {}; 
    virtual void foo() { std::cout << "FOO!\n";} 
    virtual void bar() { std::cout << "BAR!\n";} 
}; 

=0语法意味着它未在接口中定义的,但必须在于满足接口类来定义。还要注意,如果你有任何虚拟函数,你几乎总是也想要一个虚拟析构函数。由于没有实现函数,因此如果您尝试单独制作thing_interface,C++会告诉您一个错误。

这不是一个障碍,因为我不能想到Java在这里可以做的任何C++所不能做到的事情。

+0

我是一个完整的C++ noob。所以也许我不明白一切正确。对我来说,这个“接口”看起来更像是一个抽象类,Java中的抽象类也可以有字段。 (比如'int member;')这一切看起来像Java中的抽象类中的抽象方法。但抽象类与接口不同。 –

+0

这只是确切的:我不认为你可以像继承类构造函数那样初始化public(!)'member',因为它是'thing_interface'classe的成员。或者我错了? – azf

+1

@Fatal:是的,C++中的抽象类与Java中的抽象类非常相似。但是,C++没有“接口”的单独概念,因此您也可以使用抽象类来在Java中使用接口。如果你希望它成为一个接口,你就不会放入任何数据成员或非纯虚函数。 –

10

如果这样定义,你可以有你想要的东西:

class A { 
    public: 
    virtual void pure_virtual(int param1) = 0; 
    virtual ~A() { }; 
}; 

编辑:感谢尼古拉和Mike!

+5

一个重要的省略 - 你*需要*添加一个虚拟析构函数。 –

+2

你通常不希望析构函数是* pure * virtual(只是虚拟的)。它需要一个实现,不管它是否纯粹,并且在类定义'virtual〜A(){}'中定义它最简单。 –

1

就界面/抽象类而言,你不会觉得障碍。您应该阅读关于C++纯虚函数和抽象类。

要在C++接口,这里是须藤代码:

class MyInterface { 
    virtual void func1() = 0; 
    virtual int func2(int x, int y) = 0; 
} 


class MyAnotherInterface { 
    virtual void func3() = 0; 
    virtual int func4(int x, int y) = 0; 
} 

要具有抽象类在C++中,这里是须藤代码。你可以看到它只从上面的接口实现一个功能。所以你不能创建它的实例。

class MyAbstract : public MyIterface { 
    void func1() { 
    printf("in func1"); 
    } 
} 

现在实际的具体类:

class MyConcreteClass : public MyAbstract, public MyAnotherIterface { 
    int func2(int x, int y) { 
    printf("func2 x=%x,y=%y",x,y); 
    } 

    void func3() { 
    printf("in func3"); 
    } 

    int func4(int x, int y) { 
    printf("func4 x=%x,y=%y",x,y); 
    } 
} 

有当您使用多重继承,因为我使用MyConcreteClass一些问题。但是如果你只有一个带有成员变量的基类,而其他基类只包含纯虚函数,那么这个模式的行为与Java完全相同,其中包含一些方法和成员变量的类映射到extends以及其他只包含纯虚函数映射的类'工具。

在我们的例子中,相当于Java代码

class MyConcreteClass extends MyAbstract implements MyAnotherInterface { 
    public int func2(int x, int y) { 
    System.out.print(String.format("func2 x=%x,y=%y",x,y)); 
    } 

    public void func3() { 
    System.out.print("in func3"); 
    } 

    public int func4(int x, int y) { 
    System.out.print(String.format("func4 x=%x,y=%y",x,y)); 
    }  
} 

当你喂差点

唯一的其他地方,我从Java到来时感觉障碍为仿制药。 C++为此提供了模板,但它们有一些严重的限制。

+1

最好解释,至少对于像我这样的Java背景的人来说。 –