是否可以从模板基类继承,并用模板参数重写虚拟函数



当我使用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 TconstT本身上是合格的。那么给定Tint*,则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析构函数。

实时

相关内容

  • 没有找到相关文章

最新更新