C++多态
类似代码如下:
class A
{
public:
virtual void Test(){}
};
class B:public A
{
public:
virtual void Test(){}
};
B b;
A a = b;
A * pA = &b;
a.Test();
pA->Test();
大家都知道a.Test调用的是A::Test,而pA->Test调用的是B::Test,那么为什么呢?
首先来看a.Test;其实很容易理解,这里的a就是一个A类型的变量,它的内存布局在赋值的时候已经从B转换到A了,多于的数据都被丢弃,b对象的虚函数表不会被复制,A a时内存里已经有a的虚函数表了,因此其就是一个A类型的变量。
而对于pA来说,其是一个指针,其类型虽然是A,但指向的区域的内容却是一个B类型的内存结构,虽然内存结果的布局与A兼容,但其虚函数表中的Test却是B的实现;因此如上面所说。同样引用也会达到如此的效果。
Java里面实现就不同,A a = b这个再java里就是传递引用,相当于A * pA = &b;
我想这就是所说的指针和引用不会引发内存中任何“与类型有关的内存委托操作”吧。
转载网址:http://www.cppblog.com/windcsn/archive/2011/04/06/143482.html
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法