2016-04-28 64 views
0

這裏是我的代碼:我得到的錯誤:不能聲明變量「a」是抽象類型的「A」

#include <iostream> 

using namespace std; 

class Base 
{ 
    public: 
     virtual void Sub1() = 0; 
     virtual void Sub2(); 
     virtual void Sub3(); 
     void Sub4(); 
}; 

class A : public Base 
{ 
    public: 
     void Sub2(); 
     void Sub4(); 
}; 

class B : public A 
{ 
    public: 
     virtual void Sub1(); 
     void Sub2(); 
}; 

class C : public Base 
{ 
    public: 
     virtual void Sub1(); 
     virtual void Sub4(); 
}; 

void Base::Sub2() 
{ 
    cout << "Hello from Base::Sub2()" << endl; 
} 

void Base::Sub3() 
{ 
    cout << "Hello from Base::Sub3()" << endl; 
    Sub1(); // DONT MISS THIS CALL IN YOUR ANSWER 
} 

void Base::Sub4() 
{ 
    cout << "Hello from Base::Sub4()" << endl; 
} 

void A::Sub2() 
{ 
    cout << "Hello from A:Sub2()" << endl; 
} 
void A::Sub4() 
{ 
    cout << "Hello from A:Sub4()" << endl; 
} 

void B::Sub1() 
{ 
    cout << "Hello from B:Sub1()" << endl; 
} 
void B::Sub2() 
{ 
    cout << "Hello from B:Sub2()" << endl; 
} 

void C::Sub1() 
{ 
    cout << "Hello from C:Sub1()" << endl; 
} 
void C::Sub4() 
{ 
    cout << "Hello from C:Sub4()" << endl; //error used to say from Sub2 
} 

void Sub(Base& x) 
{ 
    x.Sub1(); 
    x.Sub2(); 
    x.Sub3(); 
} 
void AnotherSub(A& a) 
{ 
    a.Sub1(); 
    a.Sub2(); 
    a.Sub4(); 
} 

int main() 
{ 
    A a; // wont compile 
    B b; 
    C c; 
    Sub(a); 
    Sub(b); 
    Sub(c); 
    AnotherSub(b); 
} 

我在與A a;麻煩,顯然結束Sub(a);因爲不能被使用,但在最後,它說,「錯誤:不能聲明變量'a'是抽象類型'A'」任何幫助將不勝感激,謝謝。

---另外如果有幫助,輸出不帶A a;作品看起來像:

Hello from B:Sub1() 
    Hello from B:Sub2() 
    Hello from Base::Sub3() 
    Hello from B:Sub1() 
    Hello from C:Sub1() 
    Hello from Base::Sub2() 
    Hello from Base::Sub3() 
    Hello from C:Sub1() 
    Hello from B:Sub1() 
    Hello from B:Sub2() 
    Hello from A:Sub4() 
+1

因爲'A'沒有實現從'Base'繼承的純虛函數'Sub1()'。 – songyuanyao

+0

相關:[虛函數和純虛函數之間的區別](http://stackoverflow.com/q/2652198)它可能有助於更好地理解問題。 –

+0

您應該發佈錯誤消息。 – Galik

回答

2

此行到您的類Base

virtual void Sub1() = 0; 

使類Base或任何類別擴展它一個抽象類,如果你不執行功能Sub1,這是您的課程案例爲A

您不能創建抽象類的實例,因爲它具有沒有實現的方法,這意味着無法調用。這種類只能通過繼承來使用。

所以你需要直接在BaseA上實現它,如果你想創建A實例。

0

您正在從A擴展基類,但您未在A中實現純虛擬方法。因此,您需要將A設置爲抽象類。它不能成爲具體的課程。

要忽略將A作爲抽象並將其用作具體類,只需使用純虛擬方法,並將其定義爲不帶任何語句。現在您可以爲A創建一個實例。

0

你的編譯器是正確的:你不能創建一個抽象類型的變量。你class Base是抽象的,因爲它聲明瞭一個純虛方法,這是一個功能沒有任何實現:

virtual void Sub1() = 0; 

你從Base衍生class A是抽象的,也因爲它不提供用於該方法的重寫實現。

您必須爲所有聲明的虛擬方法提供一個實現,以使類型可實例化。當您覆蓋class B中的純虛擬Sub1()時,可以創建B類(及其後代類)的變量,但class A不能用作變量的實際類型。

0

我想補充的是因爲Base是抽象的,而A類沒有實現它的一個純虛函數,所以A也是抽象的。由於抽象類不能被實例化(只允許指針和引用),我們使用抽象類的指針(比如指向A的指針)來實例化從抽象類派生的類的對象(在這種情況下爲A或base)。 所以,你需要提供執行純虛函數,並且必須使用指針,就像

A *a; 
a = new B(); // it would compile now 

希望你有我的觀點。

相關問題