一般C++实现多态时,可以利用虚函数,不同子类对于父类虚函数进行重写,达到多态效果。
例如:
#include
using namespace std;
class Animal
{
public:
virtual void voice (void) const = 0;
virtual ~Animal (void) {}
};
class Cat : public Animal
{
public:
virtual void voice (void) const
{
cout << "喵" << endl;
}
};
class Dog : public Animal
{
public:
virtual void voice (void) const
{
cout << "汪" << endl;
}
};
void voice (const Animal* animal)
{
animal->voice ();
}
int main (void)
{
voice (new Cat);
voice (new Dog);
return 0;
}
而利用模板技术,可以在编译期根据类类型来决定调用哪个类的接口。
代码如下:
#include
using namespace std;
class Cat
{
public:
void voice (void) const
{
cout << "喵" << endl;
}
};
class Dog
{
public:
void voice (void) const
{
cout << "汪" << endl;
}
};
template
void voice (T const* t)
{
t->voice();
}
int main (void)
{
voice (new Cat);
voice (new Dog);
return 0;
}
相比虚函数方式,模板方式实现的多态由于不需要虚表指针,直接调用函数,运行期的效率比较高。代价是二进文件比较大。