一般的大家的印象中要实现对象的多态调用,必须用指针来实现,其实引用也可以实现相同的效果。看下面的例子:
1 #include <iostream>
2
3 #include <cstdio>
4
5 class Object {
6
7 std::string type_name;
8
9 protected:
10
11 explicit Object(std::string const& type_name) : type_name(type_name) {};
12
13 public:
14
15 Object() : type_name("Object") {};
16
17 Object(Object const &other) : type_name(other.type_name) {};
18
19 virtual void print() { std::cout << type_name; };
20
21 virtual ~Object() {};
22
23 };
24
25
26
27 class Door : public Object {
28
29 std::string handle;
30
31 public:
32
33 Door() : Object("Door"), handle("normal") {}
34
35 explicit Door(std::string const &handle) : Object("Door"), handle(handle) {}
36
37 Door(Door const &other) : Object(other), handle(other.handle) {}
38
39 virtual void print() { Object::print(); std::cout << " " << handle << std::endl; }
40
41 virtual ~Door() {}
42
43 };
44
45
46
47 class Book : public Object {
48
49 std::string title;
50
51 std::string author;
52
53 public:
54
55 Book() : Object("Book"), title(), author() {}
56
57 Book(std::string author, std::string title) : Object("Book"), title(title), author(author) {}
58
59 Book(Book const &other) : Object(other), title(other.title), author(other.author) {}
60
61 virtual void print() { Object::print(); std::cout << " " << title << " by " << author << std::endl; }
62
63 virtual ~Book() {}
64
65 };
66
67
68
69 void print(Object& object) {
70
71 object.print();
72
73 }
74
75
76
77 int main(int argc, const char * argv[])
78
79 {
80
81 Object object;
82
83 Door door("simple");
84
85 Book book("program", "C++");
86
87 print(object);
88
89 std::cout << std::endl;
90
91 print(door);
92
93 print(book);
94
95 system("pause");
96
97 }
可以猜下输出应该是什么,我在dev C++下编译通过,输出如下:
Object
Door simple
Book C++ by program
原理还是比较简单的,主要是理解引用底层是怎么实现的。
C++ 文档只规定了引用该实现什么样的功能,却没有说明怎么实现,在底层引用其实是根据const 指针来塑模的,列如
int & r = i;
在背后的实现可能为
int * const ptr = &i;
然后
r = 9;
等价于
*ptr = 9;
所以说引用也可以实现相同的多态功能。这也解释了引用的特性。
原文链接: https://www.cnblogs.com/dxnbd/p/3139806.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/92394
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!