平台要求:输入一串数字,输出:1、数字串位数;2、将原数字串每一位分开输出;3、将原数字串逆序输出
以用vs2022用试运行成功,可平台显示答案错误
可以帮忙看看是哪里出问题了吗
看看题目有没有规定范围,比如最大不超过10位么?
还有遇到结尾有0的数字,比如 100,你能转换对么?
建议这种问题,不要用数字,用字符串来做,可靠,并且位数几乎无限制。
还有,你的平台如果是gcc,可能不支持scanf_s哦
对象的静态类型:对象在声明时采用的类型。是在编译期确定的。(比如下面的h1,Human也就是他原本的类型就是静态类型,而他指向的对象的类型Student也就是动态类型)
对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改
静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。
动态绑定:绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在运行期。
接着我们通过汇编代码,来观察多态是在哪个阶段实现的, 就可以知道它是静态还是动态。
int main()
{
Student s1;
Human& h1 = s1;
Human h2 = s1;
h1.print();
h2.print();
return 0;
}
可以看到h1的print是满足多态的,这里调用的函数是在
这一阶段中找到eax中存储的虚函数指针,所以可以发现,满足多态的调用是在运行的时候,到对象中的找到虚函数指针来完成的调用
而下面h2的print则不满足多态,所以是直接在编译时从符号表中找到函数的地址后调用。
所以可以得出的结论是,满足多态的函数调用时在运行的时候调用的,也就是动态多态。而之前重载那一章节也曾经说过重载也是一种多态的表现,只不过重载是在编译的时候完成的调用,所以也被静态多态。
- 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态,比如:函数重载
- 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体行为,调用具体的函数,也称为动态多态。