是否可以从模板基 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 T
,const
在 T
本身上是合格的。然后给定 T
是 int*
,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
析构函数。
当我使用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 T
,const
在 T
本身上是合格的。然后给定 T
是 int*
,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
析构函数。