Chinaunix首页 | 论坛 | 博客
  • 博客访问: 328908
  • 博文数量: 79
  • 博客积分: 2466
  • 博客等级: 大尉
  • 技术积分: 880
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-07 16:47
文章分类

全部博文(79)

文章存档

2014年(3)

2012年(7)

2011年(14)

2010年(2)

2009年(2)

2008年(2)

2007年(18)

2006年(31)

分类: C/C++

2011-08-28 20:24:27

class Shape {
  public:
    virtual double area() const = 0;
};
class Circle : public Shape {
  public:
    float area() const; // error! different return type    
};

int
main() {
}

在继承关系中,子类覆盖父类的虚函数的时候,必须连返回值类型也完全相同。所以上面这个程序编译是编不过的:
main.cpp:9: error: conflicting return type specified for `virtual float Circle::area() const'
main.cpp:5: error:   overriding `virtual double Shape::area() const'

但是这个限制在所谓的“Covariant return type”的情况下可以被放松。如果基类的一个虚函数返回值类型是B*,那么其派生类中覆盖这个函数的时候,返回值类型可以是D*,其中D是任何以public方式继承自B的派生类(也就是说D is-a B)。如果基类的虚函数返回B&,派生类覆盖这个函数的时候也可以返回D&。

例如这段程序编译就没有问题:

class Shape {
  public:
//    virtual double area() const = 0;
    virtual Shape* clone() const = 0;
};
class Circle : public Shape {
  public:
//    float area() const; // error! different return type
    virtual Circle* clone() const;
};

int
main() {
}

当程序通过指向基类(接口)的指针操纵不同的派生类(实体类)的对象时,派生类方法返回的D*/D&类型的值,可以被自动转换为B*/B&类型。

=================

看下面的例子。要点:返回值(A*,B*)涉及到的类,和虚函数所在的类(C和D),可以分属于两个完全不同的继承体系。

class A { };
class B: public A { };
class C {
  public:
    virtual A* getA() const = 0;
};
class D: public C {
  public:
    B* getA() const;
};

这段程序编译没有错误。

顺便说一下,在Java语言里,Covariant return type从JDK5.0之后才被允许,更老的版本上是不允许的。
阅读(2375) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~