当我使用class Derived: public Base<int*>
时,由于编译过程中的显式实例化,我认为基类模板是像virtual void foo(const int* a) {}
一样的成员函数。然而,如果我这样写,它永远不会显示出"派生类";。发生了什么事?
#include <iostream>
using namespace std;
template<typename T>
class Base
{
public:
virtual void foo(const T a)
{
cout << "Base foo" << endl;
}
};
class Derived : public Base<int*> // But " template<typename T> class Derived : public Base<T> {...} " works fine...
{
public:
virtual void foo(const int* a)
{
cout << "Derived foo" << endl;
}
};
int main()
{
Base<int*>* p = new Derived;
p->foo(0); // "Base foo"
}
请注意,对于const T
,const
在T
本身上是合格的。那么给定T
是int*
,则Base<T>::foo
的参数类型,即const T
将是int * const
(指向非常量int
的常量指针(,而不是const int *
(指向常量int
的非常量指针(。
您应该将Derived::foo
更改为
virtual void foo(int* const a)
{
cout << "Derived foo" << endl;
}
其他问题:(1(最后不要忘记给delete
指针p
;(2(Base
应该有一个virtual
析构函数。
实时