Redian新闻
>
一个让我比较困惑的问题 c++ inheritence
avatar
一个让我比较困惑的问题 c++ inheritence# Programming - 葵花宝典
k*s
1
也算是c++老手了,今天遇到一个和奇怪的问题,具体
见以下程序。关键是set(),set2()的结果不同,也就是
set : ((c_base*)this)->operator[](i) = p;
set2: ((c_base)*this).operator[](i) = p;
的区别在那里?(set2无法改变数组元素)
我用的是linux, gcc 3.4.6,结果是:
0 : 1
1 : 2
2 : 3
0 : 1
1 : 2
2 : 3
0 : 1
1 : 0
2 : 3
avatar
t*t
2
当然不同
(c_base*)this是把指针类型转换,指向的还是原来的地方
(c_base)*this是创造临时对象,换地方了,当然不能改原来值
老革命遇到新问题????

【在 k***s 的大作中提到】
: 也算是c++老手了,今天遇到一个和奇怪的问题,具体
: 见以下程序。关键是set(),set2()的结果不同,也就是
: set : ((c_base*)this)->operator[](i) = p;
: set2: ((c_base)*this).operator[](i) = p;
: 的区别在那里?(set2无法改变数组元素)
: 我用的是linux, gcc 3.4.6,结果是:
: 0 : 1
: 1 : 2
: 2 : 3
: 0 : 1

avatar
t*t
3
BTW, 不知道你干嘛要overload这些,直接用父类的就好了

【在 t****t 的大作中提到】
: 当然不同
: (c_base*)this是把指针类型转换,指向的还是原来的地方
: (c_base)*this是创造临时对象,换地方了,当然不能改原来值
: 老革命遇到新问题????

avatar
D*g
4
区别是后者是把value转换了(a new instance is created)

【在 k***s 的大作中提到】
: 也算是c++老手了,今天遇到一个和奇怪的问题,具体
: 见以下程序。关键是set(),set2()的结果不同,也就是
: set : ((c_base*)this)->operator[](i) = p;
: set2: ((c_base)*this).operator[](i) = p;
: 的区别在那里?(set2无法改变数组元素)
: 我用的是linux, gcc 3.4.6,结果是:
: 0 : 1
: 1 : 2
: 2 : 3
: 0 : 1

avatar
k*s
5
你说的对。我一直没有写过类似的代码,所以没有太注意。
新水上有人也给过解答. 正确的写法有好几种,
((c_base*)this)->operator[](i)
((c_base&)*this).operator[](i)
this->c_base::operator[](i)
我现在用的是最后一种,觉得比较简洁明了

【在 t****t 的大作中提到】
: 当然不同
: (c_base*)this是把指针类型转换,指向的还是原来的地方
: (c_base)*this是创造临时对象,换地方了,当然不能改原来值
: 老革命遇到新问题????

avatar
k*s
6
我用deque作为基类, 写了一个管理指针的container,
不过我只需要push_back, pop_back, size的几个接口。

【在 t****t 的大作中提到】
: BTW, 不知道你干嘛要overload这些,直接用父类的就好了
avatar
t*t
7
我的意思是你根本不需要写push_back, op[], size,因为你反正是调用父类的,写不写
都一样,不写说不定还速度快点

【在 k***s 的大作中提到】
: 我用deque作为基类, 写了一个管理指针的container,
: 不过我只需要push_back, pop_back, size的几个接口。

avatar
k*s
8
比如pop_back, 作为指针,我还需要delete.
另外我也不希望直接用[] operator来改变指针的值。

【在 t****t 的大作中提到】
: 我的意思是你根本不需要写push_back, op[], size,因为你反正是调用父类的,写不写
: 都一样,不写说不定还速度快点

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。