2016-12-30 128 views
2

我正在尝试将多态与模板派生类一起使用。考虑下面的代码:具有模板派生类的基类纯虚函数

// base class 
class A { 
    public: 
    virtual void f() = 0; 
}; 

// templated derived class 
template< typename T > 
class B : public A {}; 

template <> //define a specialization of B 
class B<int> {}; 

// trying to define a specialization of f 
template <> 
void B<int>::f() {} 

我的基类有纯虚函数f。我正在存储一个基类指针向量A*,并且想在所有这些向量上调用f,并在模板派生类中使用适当的多态性。然而,我无法将f的特例,因为我收到以下错误:

test.cpp:17:18: error: no member function ‘f’ declared in ‘B<int>’ void B<int>::f() {} 

显然错误这里是f实际上不是模板类的成员函数。有什么办法可以定义f的特化(或几乎相同的东西),或者这是不可能的?如果不可能,你能提出另一种方法吗?

[道歉,如果这是一个重复 - 我搜查,发现对模板,继承和多态的问题许多变化,但没有完全相符我的。]

回答

-2
template <> //define a specialization of B 
class B<int> {}; 

您的专业没有定义覆盖虚拟功能。将此专业化更改为:

template <> //define a specialization of B 
class B<int> : public A 
{ 
    public: 
     void f() override; 
} 

专业化就像定义一个新类一样。你必须定义其中的所有内容。如果专业化应该有一个特定的方法:定义它。

编辑:也纠正了从原来的问题继承的错字。

+1

专业化不应该从'A'继承吗? – Rakete1111

+0

谢谢,这解决了这个问题(尽管我的代码中有一些额外的错误)。 @ Rakete1111是正确的,专业化需要从A继承为了多态性的工作,我错过了。 – user7359309

+0

是的,这也是另一个问题,纠正了。 –