c++返回类型协变

在C++中,只要原来的返回类型是指向基类的指针或引用,新的返回类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型。这样的类型称为协变返回类型(Covariant returns type).

返回类型协变

覆盖要求函数具有完全相同的入参。

一般覆盖具有相同的返回值,否则会提示错误

virtual double area ()const = 0;
virtual float area ()const ; //编译器提示错误,返回类型不同

这个规则对返回类型协变而言,则有所放松。覆盖的返回值不区分基类或派生类。从语意上理解,一个派生类也是一个基类。如下:

Class ShapeEditor  ...{……};
Class Shape 
    ...{
    public:
    virtual const ShapeEditor & getEditor ()const = 0; //Factory Method
};

Class Circle;
Class CircleEditor : public ShapeEditor...{ … };
Class Circle : Public Shape
...{
    public:
    const CircleEditor &getEditor ()const ;
};

在这个例子中,注意CircleEditor必须在Circle::getEditor的声明之前被完整地定义(而不能仅仅声明),因为编译器必须知道CircleEditor对象的布局,才能执行适当的地址操纵,从而将一个CircleEditor引用
(或指针)转换为一个ShapeEditor引用(或指针)。
  协变返回类型的优势在于,总是可以在适当程度的抽象层面工作。若我们是处理Shape,将获得一个抽象的ShapeEditor;若正在处理某种具体的形状类型,比如Circle,我们就可以直接获得CiecleEditor.协变返回机制将我们从这样的一种处境解脱出来:不得不使用易于出错的转换操作来“重新”提供类型信息,

class Base
{
public:
    Base()
    {
       cout<<"Base:: Base()"<<endl;
    }

    ~Base()
    {
        cout<<"Base::~Base()"<<endl;
    }
    virtual Base& operator=(const Base& b)
    {
        cout<<"Base::operator=(const Base& b)"<<endl;
        return *this;
    }

};

class Derived:public Base
{
public:
    Derived()
    {
       cout<<"Derived:: Derived()"<<endl;
    }

    ~Derived()
    {
        cout<<"Derived::~Derived()"<<endl;
    }
    virtual Derived& operator=(const Base& b)
    {
        cout<<"Derived::operator=(const Base& b)"<<endl;
        return *this;
    }

};


void FunTest()
{
    Derived d1,d2;
    Base b;

    Base& pBase = d1;
    pBase.operator=(d2);

}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Wan_shibugong/article/details/82751298