2012-06-15 83 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。我想要其他非矩形類(例如,三維數組列表)以擴展它。 –