-
Notifications
You must be signed in to change notification settings - Fork 160
/
covariant_return.cpp
52 lines (40 loc) · 1.48 KB
/
covariant_return.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*
# Covariant return
The return value of an overriding method that returns a pointer
can return a pointer derived class of the return type of the overriden method.
*/
#include "common.hpp"
int main() {
class Base {
public:
int i;
Base(int i) : i(i) {}
virtual Base* f() { return new Base(0); }
virtual Base* g() { return new Base(0); }
Base* h() { return new Base(0); }
};
class Derived : public Base {
public:
Derived(int i) : Base(i) {}
// THIS is the covariant return.
// It only works because `Derived` is derived from `Base`.
virtual Derived* f() { return new Derived(1); }
/*
ERROR: conflicting return: int is not derived from `Base`.
Contrast this to overlading where different returns are possible.
The difference here is that polymorphism this is decided at runtime,
so we must know the return beforehand to typecheck things properly.
*/
//virtual int* g() { return new int(1); }
// OK: all of this only applies to virtual methods.
// Non-virtual methods just hide as usual, no overriding.
int* h() { return new int(2); }
};
Base *bp;
Derived d(-1);
bp = d.f();
// Derived class got called: polymorphism.
assert(bp->i == 1);
// Base class got called: no polymorphism.
assert(bp->h()->i == 0);
}