2011-09-26 49 views
0

的實例繼承我有兩個類如在頭文件從模板類

template<size_t N> 
class Parent{ 
    protected: 
    char array[N]; 
    size_t i; 
    public: 
    virtual void operator()(int i); 
}; 

template<size_t N> 
void Parent<N>::operator()(int i){ 
    this->i = i; 
} 

class Child: public Parent<16>{ 
    public: 
    virtual void operator()(); 
}; 

孩子有操作者()()以CPP文件別處定義如下。每當我從另一個cpp文件中包含這個頭文件時,我可以訪問operator()(),但operator()(int)甚至沒有定義。爲什麼是這樣?我認爲,因爲我繼承了Parent的特定實例,所以它的所有方法都應該實例化並且可用。

+2

那是實際的代碼嗎?你有一個沒有返回類型的函數。 –

+0

顯示您正在使用的確切代碼(或縮小的同一事物的示例)和編譯器錯誤。 – selalerer

+0

您可以通過縮進代碼來幫助人們...... – arne

回答

2

除了在你的代碼中的錯誤,這是隱藏一個例子:你的派生類中聲明的同名的,但不同的簽名功能作爲基類的。因此,基函數是隱藏

class A { virtual void foo(); }; 

class B : public A { virtual void foo(int); /* hides A::foo() ! */ }; 

繼承隻影響具有相同的簽名(有一些例外輕度)函數。

您的基類函數被聲明爲void Parent<N>::operator()(int),而在派生類中聲明void Child::operator()()

在C++ 11中,如果函數沒有覆蓋任何東西,您可以明確地聲明virtual void foo(int) override觸發編譯器錯誤。

如果您有意來定義具有相同名稱的新功能爲現有的,但不同的簽名,而不是重寫基函數,那麼你可以製造基地功能與using指令可見:

class C : public A 
{ 
    using A::foo(); 
    void foo(int); 
}; // now have both C::foo(int) and C::foo() 
+0

添加關於使用'using'使隱藏功能可見的信息。 –

+0

@ K-ballo:好的,完成了。我不確定OP是否在尋找,但實際上很可能。 –

+0

謝謝。我在睡覺之前發佈了這個榜樣。我很感激幫助。我認爲我之前遇到過這個問題,但似乎無法將「使用」運算符用於我對C++的瞭解。 –

0

因爲Parent的operator()隱藏了Child的操作符()(它們有不同的簽名)。在編譯代碼時,你怎麼沒有得到警告?

這是應該的:

class Child: public Parent<16>{ 
    public: 
    using Parent<16>::operator(); 
    virtual void operator()(); 
};