父类转子类,c++对象布局

1

TextView *textview = (TextView*)v.get();

 sp<android::text::CharSequence> chars = textview->getText();

 sp<android::text::String> str = chars->toString();


2

  android::sp<android::text::String> str = static_cast<android::text::String*>((static_cast<TextView*>(v.get()))->getText().get());


3

android::sp<android::text::String> str = (static_cast<TextView*>(v.get()))->getText()->toString();


CharSequence为String的父类,为抽象类,此处1和3等价,而1和2不等价,2的转换是错误的


原因是此处CharSequence的真实类型是SpannableStringBuilder,而非String,此处2用dynamic_cast也不可以,2个子类并不相互继承


因此遇到CharSequence,不能确定其真实类型的时候,绝对不要随便转换为你想要的类型,是它的子类,但不一定就是它的真实类型


    sp<String> SpannableStringBuilder::toString() const
        {
#if 0
            int len = length();
            //wchar_t buf[len];
            char buf[len];

            getChars(0, len, buf, 0);
            //return *(new std::string(buf));// pay attention
            std::string s1(buf);
            return s1;
#else
            return mText->toString();
#endif
    }


sp<String> CharArray16::toString() const
  {
            char *utf8 = cn_utf16_to_utf8(mArray, mLength, NULL, NULL);
            if (utf8 == NULL) {
                return NULL;
            }

            sp<String> str = new String(utf8);

            free(utf8);
            return str;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值