C ++抽象类

时间:2011-12-01 20:11:53

标签: java c++

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

3 个答案:

答案 0 :(得分:10)

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

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

编辑:谢谢Nikolai和Mike!

答案 1 :(得分: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 ++无法做到。

答案 2 :(得分:1)

在界面/抽象类方面,你不会感到有障碍。您应该阅读有关C ++纯虚函数和抽象类的信息。

要在C ++中使用接口,这里是sudo代码:

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 ++中使用抽象类,这里是sudo代码。你可以看到它只从上面的接口实现了一个功能。所以你不能创建它的实例。

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,其他类只包含纯虚函数映射到`implements'。

在我们的示例中,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 ++有模板,但它们有一些严重的限制。