2012-12-27 27 views
1

父類否 '空隙TestSub ::打印()' 的成員函數類 'TestSub'

class Test { 
public: 
    Test(){}; 
    virtual ~Test(){}; 
    void print() { cout<<1<<endl;}; 
}; 

子類中聲明的.h定義

class TestSub: public Test { 
public: 
    TestSub(); 
    virtual ~TestSub(); 
}; 

子類的.cpp實現

#include "TestSub.h" 

TestSub::TestSub() { 

} 

TestSub::~TestSub() { 
} 

void TestSub::print(){ 
    cout<<2<<endl; 
} 

int main(){ 
    TestSub *t=new TestSub(); 
    t->print(); 
} 

原因:

.. \ src \ TestSub.cpp:17:2 1:錯誤:no'TestSub :: print()'成員函數在類'TestSub'中聲明

+0

你忘了這個類型..而不是'void TestSub :: print()'。 – Rapptz

+0

我照你所說的做,但不彈出'void TestSub :: print()' – jiafu

回答

0

如果不指定返回類型,則C默認爲int作爲函數的返回類型。它與類中聲明的void返回類型不匹配。

1

你有2個錯誤:

  • 首先,你必須聲明你在TestSub用作:void print();

  • 其次,你必須指定你實現一個返回類型,C++不接受默認返回類型如C,所以您必須執行轉換爲void TestSub::print() {...}

+0

我不明白爲什麼testsub應該聲明void print(),它是從具有print方法的test擴展而來的。謝謝你的解釋 – jiafu

+0

你說得對,它是從'Test'派生出來的,但是編譯器應該知道你想要改變基類的實現,除非你在你的類中說過嗎? – BigBoss

1

print()funciton未在TestSub類中聲明。

class TestSub: public Test { 
public: 
    TestSub(); 
    void print();  // add declaration. 
    virtual ~TestSub(); 
}; 

我猜你也打算讓Test::print虛擬?

class Test { 
public: 
    Test(){} 
    virtual ~Test(){} 
    virtual void print() { std::cout << 1 << std::endl;} 
}; 
+0

Testsub擴展測試,所以它必須有打印方法,爲什麼仍然需要聲明它? – jiafu

+0

,因爲你試圖再次定義它'void TestSub :: print()'。如果你想Test :: print打印'1'和TestSub :: print打印2,則需要在TestSub中創建Test :: print virtual並重寫。這最終導致函數多態性 – billz