【问题标题】:Multiple inheritance for abstract classes in C++C++中抽象类的多重继承
【发布时间】:2012-06-15 19:50:33
【问题描述】:

Java 不支持抽象类的多重继承,但我正在尝试在 C++ 中做类似的事情:

//this is Java-style pseudocode
public abstract class Rectangle{
    public abstract double getHeight();
    public abstract double getWidth();
    public double getHeight(){
        return getWidth()*getHeight();
    }
}

public abstract class Container{
    public abstract void printTypes();
    public abstract void printEachElement();
    public void printContainerStuff(){
        System.out.print("Has the types: ");
        printTypes();
        System.out.print("List of elements: ");
        printEachElement();
    }
}

public abstract class Array extends Rectangle, Container{ //this can't be done in Java, but what about C++?

}

C++ 中是否有等效的 Java 抽象类可以做到这一点?

【问题讨论】:

    标签: java c++ class inheritance abstract


    【解决方案1】:

    要使 C++ 中的类抽象,至少一个成员函数必须是纯虚函数:

    class X
    {
    public:
        virtual void f() = 0;
    };
    

    如前所述,C++ 中允许多重继承:

    class Rectangle
    {
    public:
        virtual double getHeight() = 0;
        virtual double getWidth() = 0;
        double getHeight(){
            return getWidth()*getHeight();
        }
    };
    
    class Container
    {
    public:
        virtual void printTypes() = 0;
        virtual void printEachElement() = 0;
    };
    
    class Array: public Rectangle, public Container
    {
        // If the pure virtual member functions in the base classes
        // are not implemented then this class is also abstract.
    };
    

    【讨论】:

      【解决方案2】:

      C++ 允许多重继承。所以这在 C++ 中是允许的。

      在 C++ 中相当于 Java 的抽象类是一个至少有一个 pure virtual 成员函数的类。

      因此,C++ 中的 Java 代码等效如下:

      class Rectangle
      {
        public:
          virtual double getHeight() = 0;
          virtual double getWidth() = 0;
          double getHeight(){
              return getWidth()*getHeight();
          }
      };
      
      class Container(){
        public:
          virtual void printTypes() = 0;
          virtual void printEachElement() =0;
      };
      

      【讨论】:

      • 抱歉,我在注意到 hmjd 已经提供了您的答案中缺少的信息之前编辑了您的答案。我回滚了,我不知道这是不是应该做的事情......
      • C++ 中的纯虚函数是否类似于 Java 中的抽象方法?
      • 另外,是否可以在类中创建无需创建类实例即可调用的方法(如Java中的静态方法?)
      • @AndersonGreen:是的。您也可以拥有静态成员函数。搜索它。
      【解决方案3】:

      我认为您正在寻找 Java 接口。

      public abstract class Rectangle{
          public abstract double getHeight();
          public abstract double getWidth();
          public double getHeight(){
              return getWidth()*getHeight();
          }
      }
      
      public interface Container {
          public void printTypes();
          public void printEachElement();
      }
      
      public abstract class Array extends Rectangle implements Container {
      }
      

      在 C++ 中,您可以拥有多重继承。您还可以使用带有纯虚拟方法的 Java 接口。

      class Container {
          public:
              virtual void printTypes() = 0;
              virtual void printEachElement() = 0;
      }
      

      【讨论】:

      • 我实际上正在寻找抽象类的多重继承——在 Java 中这是不可能的,但在 C++ 中我认为这是可能的。接口不能实现自己的方法,但抽象类可以。
      • @AndersonGreen - 你在所有方面都是正确的。在 Java 中,您可以实现多个接口,但您只能从一个类继承(Object,如果您不指定其他任何内容)。在 C++ 中,您可以从任意数量的类继承,无论是抽象的还是非抽象的。
      【解决方案4】:

      如果你想要继承行为。 (代码是Java,你可以在c++中尝试这样的事情)

      abstract class Rectangle{
      
          public abstract double getHeight();
          public abstract double getWidth();
          public double getHeight(){
              return getWidth()*getHeight();
          }
      }
      
      abstract class Container extends Rectangle{
          public abstract void printTypes();
          public abstract void printEachElement();
      }
      
      abstract class Array extends Container{ 
      
      }
      

      【讨论】:

      • 我不希望 Container 类扩展 Rectangle。我希望其他非矩形类(例如,3 维数组列表)也对其进行扩展。
      猜你喜欢
      • 1970-01-01
      • 2019-04-30
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多