2012-06-15 80 views
1

Java不支持多重继承抽象类的抽象类,但我试图做的在C++中等价的:多重继承在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++? 

} 

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

回答

2

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

而C++中Java的抽象类的等价物是至少有一个类的成员函数,它至少有一个纯的virtual成员函数。

所以Java代码的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; 
}; 
+0

对不起,我在编辑你的答案之前注意到hmjd已经提供了你的信息。我回滚了,我不知道这是不是该做的事情... –

+0

在C++中执行纯虚函数就像Java中的抽象方法一样吗? –

+0

@安德森·格林:是的。 – Nawaz

2

我想你正在寻找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; 
} 
+0

实际上,我在寻找抽象类的多重继承 - 在Java中这是不可能的,但在C++,我认为它是可能。接口不能实现自己的方法,但抽象类可以。 –

+0

@AndersonGreen - 你在所有方面都是正确的。在Java中,您可以实现多个接口,但只能从一个类继承(如果不指定其他任何内容,则可以使用“Object”)。在C++中,你可以继承任何数量的类,不论是否抽象。 –

3

要在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. 
}; 
-1

如果你想要继承行为。 (该代码是在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{ 

} 
+1

看起来不像C++代码 –

+0

我不希望Container类扩展Rectangle。我想要其他非矩形类(例如,三维数组列表)以扩展它。 –