C语言的多态是不是是类似于用结构指针的强制转换来实现的,具体实现方式类似于Linux万能链表???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言的多态是不是是类似于用结构指针的强制转换来实现的,具体实现方式类似于Linux万能链表???相关的知识,希望对你有一定的参考价值。

请举一个简单的例子,不要用C++,谢谢!

肯定不是的啊。

这里说的多态应该是C++面向对象的多态性质。

是由于类继承之后的一种特性。


指针转换,比如    int* a =(int *)p;

其实a和p都是两个4bytes的地址数据,强制转换就是把数值转了了一下。


而多态是体现在运行时,

比如   

   class man  继承自 class person

   class woman 继承自  class person


假设有这样一段代码:

if (a == 1) 
    p = new man;

else 
    p = new woman;

那现在p可能是man或者woman了,不运行是实现不知道的,这就是多态的一种体现。

具体的p的属性实际存在内存当中的,和指针强制转换不一样。

参考技术A #include <stdio.h>
#include <stdlib.h>
struct Base
 int num;
;
struct SubClass
 Base b;
 int num2;
;
int main(int argc, char* args[])

 Base b;
 b.num = 100;
 SubClass sc;
 sc.b.num = 200;
 sc.num2 = 300;
 Base* pb;
 pb = &b;
 printf("Base.num:%d\\n", pb->num);
 pb = (Base*)&sc;
 printf("Base.num:%d\\n", pb->num);
 SubClass* psc = (SubClass*)pb;
 printf("SubClass.num2:%d\\n", psc->num2);
 return 0;

基本上可以说是的,因为C语言没有继承这个概念,数据结构只能用 组合 的方式而不能使用继承的方式,所以只能用指针类型强制转换;

由于C++有继承,所以编译器会默认允许父类指针指向子类对象而不需要类型转换;

 

上述示例只是简单的类型转换,没有写实现多态,需要的话我再补上代码 。

本回答被提问者采纳
参考技术B c语言是没有多态的。你说的强制类型转换指的是static_cast,const_cast,reinterpret_cast,dynamic_cast .
1.const_cast。
一个int*可以直接赋给一个const int*的,但是一个const int*是不可以直接赋给一个int*的。这就需要:
int* pi=const_cast<int*>pci;
2.reinterpret_cast
把整型(广义的)转换为指针,把指针转换为整型(广义的),把指针转换为另一个类型的指针。
3.static_cast
可以做任何显式的自动转换(implicit cast),也可以做那些自动转换的逆转换,但是不能消除const,volatile和对齐。
4.dynamic_cast
就是根据类型信息来cast。

通过指针、强制转换和取消引用加载向量?

【中文标题】通过指针、强制转换和取消引用加载向量?【英文标题】:Loading vectors through pointers, casts and dereferences? 【发布时间】:2017-12-10 20:57:50 【问题描述】:

OpenPower Manual | Vector Data Types 声明避免手动加载元素并使用向量转换:

在应用程序定义的地址访问向量的首选方式 是通过使用向量指针和 C/C++ 取消引用运算符 *. 与其他 C /C++ 数据类型类似,数组引用运算符 [ ] 可用于使用带有矢量指针的矢量对象访问 从向量访问第 n 个向量元素的常用定义 指针。 vec_xl等vector内置函数的使用 不鼓励使用 vec_xst,但没有取消引用的语言除外 运算符可用。

vector char vca;
vector char vcb;
vector int via;
int a[4];
void *vp;

via = *(vector int *) &a[0];
vca = (vector char) via;
vcb = vca;
vca = *(vector char *)vp;
*(vector char *)&a[0] = vca;

我正处于测试该技术的早期阶段,但上面的代码似乎可以编译。测试的编译器是 GCC 4.0.1(旧 PowerMac G5)和 GCC 4.8.5(Power 730 服务器)。

我的第一个问题是,该技术是否正确处理未对齐的字节数组?

我的第二个问题是,该技术是否会在 little-endian 系统上自动执行 big-endian 转换?

我的第三个问题是,我们应该在实践中使用该技术吗?感觉该技术应该产生未定义的行为或双关语违规。

【问题讨论】:

【参考方案1】:

我的第一个问题是,该技术是否正确处理未对齐的字节数组?

不,它不能正确处理未对齐的数组。通过屏蔽掉 4 个低位,将内存地址和偏移量截断为有效地址。

我的第二个问题是,该技术是否会在 little-endian 系统上自动执行 big-endian 转换?

是的。

我的第三个问题是,我们应该在实践中使用该技术吗?

不,不要使用它。

【讨论】:

以上是关于C语言的多态是不是是类似于用结构指针的强制转换来实现的,具体实现方式类似于Linux万能链表???的主要内容,如果未能解决你的问题,请参考以下文章

c和c++中,对结构体进行强制类型转换!

通过指针、强制转换和取消引用加载向量?

c# 调用c dll void 指针类型转化问题

C语言强制类型转换

c语言强制转换的疑问

golang结构体组合与“多态” 2021-08-06