When I use class Derived: public Base<int*>, I thought the Base class template is a member function like virtual void foo(const int* a) {} because of explicit instantiation during compilation.
However, If I write like this, it never shows "Derived class".
What's happening?
#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"
}
CodePudding user response:
Note that for const T, const is qualified on T itself. Then given T is int*, the parameter type of Base<T>::foo, i.e. const T would be int * const (const pointer to non-const int), but not const int * (non-const pointer to const int).
You should change Derived::foo to
virtual void foo(int* const a)
{
cout << "Derived foo" << endl;
}
Other issues: (1) don't forget to delete the pointer p at last; (2) Base should have a virtual destructor.
