语言陷阱:C++继承的转换

起了个很壮观的名字,也就是说,有点招摇撞骗的感觉。我想将这部分做一个系列,但有不想与别的太重合。嗯,这个系列的来源是这样的,平时总有人问我,xxx为什么无法编译通过,明明是对的,有些时候,我也这样问自己。从概念上来说,一些问题是不应该出现的,但却实际出现了,理论和实际总会出现一些冲突的。因此,我希望将一些平时我们不注意的细节记录下来,让我们在出现类似问题的时候可以寻找到答案,减少我们所犯的错误。
目前我电脑还没有安装完开发环境,所以,今天的开始只是一个回忆的开始,从我能记住的开始。改天将代码的实际测试结果和错误结果给出。
在C++中,继承很是强大,我们可以通过继承来扩展类型,但扩展是否有限制呢?先看下面的一组代码:

       void copy(int* a, int* b)
       {
       }

       void copy(byte* a, byte* b)
       {
       }

       class CBase()
       {
       public:
       CBase(){}
       virtual ~CBase(){}
       }

       class Child: public CBase
       {
       public:
       Child(){};
       virtual ~Child(){};
       }
       void copy(CBase** a, CBase** b)
       {
       }

       void main()
       {
       CBase** temp1 = new Child*[10];
       Child** temp2 = new Child*[10];
       copy(temp1, temp2);
       }
       


我希望代码的逻辑没有记错,如果没有记错的话,上面的代码不能正确运行,因为copy(temp1, temp2)被和copy(int* a, int* b)匹配,并不是和我们想的copy(CBase** a, CBase** b)匹配。但是,有一个问题,Child不是从CBase继承的吗?Child不是可以转换为CBase类型吗?是的,Child是可以转换为CBase,但Child*和CBase*的转换却不可以完成。但是,与Child*与CBase*可以进行转换最接近的形式就是int*,但又不能进行转换,所以,错误从此出现。如果有一个void*呢?理论上是可以的,不过,就像上面所说的,我还没能测试。应该可以通得过的。改天补上代码。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据