我们从代码中看什么叫做协变返回类型:
首先我们定义四个类:
class shapeEdite {
public:
virtual void pop()const {
std::cout << "i am father" << std::endl;
}
};
class shape {
public:
virtual const shapeEdite * getEdite() = 0;
};
class circle;
class circlueEdite :public shapeEdite {
public:
virtual void pop()const {
std::cout << "i am son" << std::endl;
}
};
class circle :public shape {
public:
virtual const circlueEdite * getEdite() {
return new circlueEdite();
}
};
现在我们讲解一下什么叫做协变返回类型:
我们在派生类的虚函数中返回一个circle *而不是一个shape*。只是合法的,因为circle是一个shape。注意如果一个派生类被基类操作,在这里就是指的circle* 被shape*操作,派生类中虚函数返回的circle *就会被自动转换成 shap* 。
当我们直接操作派生类而不是通过接口来操纵他们时,使用协变反应类型的优势就体现出来了:
shape * myshape = new circle();
const shapeEdite * myshapeEdite = myshape->getEdite();
//此时没有协变反应类型那么必须通过转换
const circlueEdite * mycriclueEdite =static_cast<const circlueEdite*>(myshape->getEdite());
mycriclueEdite->pop();
myshapeEdite->pop();
circle * mycircle = new circle();
const shapeEdite * circlemyshapeEdite = mycircle->getEdite();
const circlueEdite * circlemycriclueEdite = mycircle->getEdite();
circlemyshapeEdite->pop();
circlemycriclueEdite->pop();