·我们都知道,虚函数是类的多态的关键步骤,常用的在多态的实现都是子类的虚函数和基类的虚函数函数名,返回值,参数一致。
但是凡事总有例外:
关于多态有两个例外:
1.协变
class a
{
};
class b: public a
{
};
class A
{
public:
virtual a*f()
{
return new a;
}
};
class B :public A
{
public:
virtual b*f()
{
return new b;
}
};
在上面代码中,f()虚函数返回值的类型不一样,这就是协变,值得注意的是,在基类和子类虚函数返回值不同时,不一定返回基类和子类本身的解引用,还可以返回另外的需要的类的引用,这里值得注意的是,子类和基类函数返回值无论是不是本身,但两个返回值一定要是互为父类和子类的。
2.也就是析构函数,当类中开辟了空间,程序结束时,需要析构函数,那么由于析构函数的函数名是他们类的本身,所以要使用虚函数来修饰析构函数,因此函数名不同。