通过引用实现C++多态

一般的大家的印象中要实现对象的多态调用,必须用指针来实现,其实引用也可以实现相同的效果。看下面的例子:

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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午1:38
下一篇 2023年2月10日 上午1:39

相关推荐