C++抽象类

Cap*_*row 2 c++ java

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

per*_*eal 10

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

class A {
  public:
    virtual void pure_virtual(int param1) = 0;
    virtual ~A() { };
}; 
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢尼古拉和迈克!

  • 一个重要的遗漏 - 你*需要*添加一个虚拟析构函数. (5认同)
  • 您通常不希望析构函数是*纯*虚拟(只是虚拟).它需要一个实现,无论它是否纯粹,并且在类定义中定义它是最简单的,`virtual~A(){}`. (2认同)

Moo*_*uck 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";}
};
Run Code Online (Sandbox Code Playgroud)

=0语法意味着它没有在接口中定义,但必须在符合接口类定义.另请注意,如果您有任何虚函数,那么您几乎总是需要虚拟析构函数.如果你试图单独创建一个C++,C++会告诉你一个错误thing_interface,因为没有实现函数.

这不是一个障碍,因为我无法想象Java可以做的任何东西,C++不能.