C++ abstract classes

C++ abstract classes

本文关键字:classes abstract C++      更新时间:2023-10-16

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

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

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

EDIT:谢谢Nikolai和Mike!

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++不能做的。

在接口/抽象类方面,您不会感到障碍。你应该读一读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++有这样的模板,但是它们有一些严重的限制。