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

来源:互联网 发布:北航软件学院是几系 编辑:程序博客网 时间:2024/05/01 23:09

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
原创粉丝点击