是否可以从模板基 class 继承并使用模板参数覆盖虚函数?

Is it possible to inherit from a template base class with virtual function overriding with template argument?

当我使用class Derived: public Base<int*>时,我认为Base class模板是像virtual void foo(const int* a) {}一样的成员函数,因为在编译期间显式实例化。 但是,如果我这样写,它永远不会显示“Derived class”。 发生什么事了?

#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 *(指向 const int 的非常量指针)。

您应该将 Derived::foo 更改为

virtual void foo(int* const a)
{
    cout << "Derived foo" << endl;
}

其他问题:(1)最后别忘了delete指针p; (2) Base 应该有一个 virtual 析构函数。

LIVE