博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(原創) unnamed object的多型只能使用reference (C/C++)
阅读量:7186 次
发布时间:2019-06-29

本文共 1875 字,大约阅读时间需要 6 分钟。

當使用unnamed object且須多型時,只能使用 reference,若用pointer雖可compile,但結果不正確。

以下是使用reference配合unnamed object使用多型,結果正確

 1
ExpandedBlockStart.gif
ContractedBlock.gif
/**/
/* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : Polymorphism_UnnameObject_reference.cpp
 5InBlock.gifCompiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6InBlock.gifDescription : Demo how to use reference with unnamed object
 7InBlock.gifRelease     : 04/07/2007 1.0
 8ExpandedBlockEnd.gif*/
 9
None.gif#include 
<
iostream
>
10
None.gif#include 
<
string
>
11
None.gif
12
None.gif
using
 
namespace
 std;
13
None.gif
14
ExpandedBlockStart.gifContractedBlock.gif
class
 Base 
dot.gif
{
15InBlock.gifprotected:
16InBlock.gif  string text;
17InBlock.gif  
18InBlock.gifpublic:
19ExpandedSubBlockStart.gifContractedSubBlock.gif  Base() dot.gif{}
20ExpandedSubBlockStart.gifContractedSubBlock.gif  Base(const char* text) : text(text) dot.gif{}
21InBlock.gif  
22InBlock.gifpublic:
23ExpandedSubBlockStart.gifContractedSubBlock.gif  virtual string getText() dot.gif{
24InBlock.gif    return "Base's " + this->text;
25ExpandedSubBlockEnd.gif  }
26ExpandedBlockEnd.gif}
;
27
None.gif
28
ExpandedBlockStart.gifContractedBlock.gif
class
 Derived : 
public
 Base 
dot.gif
{
29InBlock.gifpublic:
30ExpandedSubBlockStart.gifContractedSubBlock.gif  Derived() dot.gif{}
31ExpandedSubBlockStart.gifContractedSubBlock.gif  Derived(const char *text) : Base(text) dot.gif{}
32InBlock.gif  
33InBlock.gifpublic:
34ExpandedSubBlockStart.gifContractedSubBlock.gif  string getText() dot.gif{
35InBlock.gif    return "Derived's " + this->text;
36ExpandedSubBlockEnd.gif  }
37ExpandedBlockEnd.gif}
;
38
None.gif
39
ExpandedBlockStart.gifContractedBlock.gif
int
 main() 
dot.gif
{
40InBlock.gif  Base &obj = Derived("C++");
41InBlock.gif  cout << obj.getText() << endl;
42ExpandedBlockEnd.gif}

執行結果

None.gif
Derived's C++

但若換成pointer,則結果錯誤

 1
ExpandedBlockStart.gif
ContractedBlock.gif
/**/
/* 
 2InBlock.gif(C) OOMusou 2007 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : Polymorphism_UnnameObject_pointer.cpp
 5InBlock.gifCompiler    : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++
 6InBlock.gifDescription : Demo how to use pointer with unnamed object
 7InBlock.gifRelease     : 04/07/2007 1.0
 8ExpandedBlockEnd.gif*/
 9
None.gif#include 
<
iostream
>
10
None.gif#include 
<
string
>
11
None.gif
12
None.gif
using
 
namespace
 std;
13
None.gif
14
ExpandedBlockStart.gifContractedBlock.gif
class
 Base 
dot.gif
{
15InBlock.gifprotected:
16InBlock.gif  string text;
17InBlock.gif  
18InBlock.gifpublic:
19ExpandedSubBlockStart.gifContractedSubBlock.gif  Base() dot.gif{}
20ExpandedSubBlockStart.gifContractedSubBlock.gif  Base(const char* text) : text(text) dot.gif{}
21InBlock.gif  
22InBlock.gifpublic:
23ExpandedSubBlockStart.gifContractedSubBlock.gif  virtual string getText() dot.gif{
24InBlock.gif    return "Base's " + this->text;
25ExpandedSubBlockEnd.gif  }
26ExpandedBlockEnd.gif}
;
27
None.gif
28
ExpandedBlockStart.gifContractedBlock.gif
class
 Derived : 
public
 Base 
dot.gif
{
29InBlock.gifpublic:
30ExpandedSubBlockStart.gifContractedSubBlock.gif  Derived() dot.gif{}
31ExpandedSubBlockStart.gifContractedSubBlock.gif  Derived(const char *text) : Base(text) dot.gif{}
32InBlock.gif  
33InBlock.gifpublic:
34ExpandedSubBlockStart.gifContractedSubBlock.gif  string getText() dot.gif{
35InBlock.gif    return "Derived's " + this->text;
36ExpandedSubBlockEnd.gif  }
37ExpandedBlockEnd.gif}
;
38
None.gif
39
ExpandedBlockStart.gifContractedBlock.gif
int
 main() 
dot.gif
{
40InBlock.gif  Base *obj = &Derived("C++");
41InBlock.gif  cout << obj->getText() << endl;
42ExpandedBlockEnd.gif}

執行結果

None.gif
Derived's

Conclusion
為什麼會如此,我並不清楚,目前只知道unnamed object若要配合多型,一定要用reference,不能用pointer,若有人知道原因請告訴我,謝謝。

转载地址:http://hhukm.baihongyu.com/

你可能感兴趣的文章
ThinkPHP 模板魔术常量
查看>>
添加非浮动的清楚元素围住浮动元素
查看>>
CentOS挂载NTFS盘符问题
查看>>
文档里组件中的methods方法调用
查看>>
Play 2.0 用户指南 - 异步HTTP编程 --针对Scala开发者
查看>>
Swift 2.0 异常处理
查看>>
Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性
查看>>
Tomcat7 redis session共享
查看>>
用逻辑运算符实现三目运算符
查看>>
php的openssl_private_encrypt的python实现
查看>>
JDK8新特性(3):Stream API补充介绍
查看>>
php连接状态测试(运行中 关闭浏览器)
查看>>
整合springMVC,Mybatis的Maven项目框架
查看>>
Keras 线性回归
查看>>
Oracle优化查询改写(第二章-给查询结果排序)
查看>>
PHP实现排列组合
查看>>
Fragment的commit的注意事项
查看>>
[UE4]LOG
查看>>
3306 scan script
查看>>
ubuntu下安装 openssl 开发库
查看>>