Java与C++中处理子类与父类同名函数的区别
Java中子类和父类的同名方法会处理为重载,若方法名和参数都相同,则覆盖父类方法。
例如:
public class Test {
public void func(int value) {
Log.d("Test", "func(int value):" + value);
}
public void func(float value) {
Log.d("Test", "func(float value):" + value);
}
}
class ChildTest extends Test {
public void func(char value) {
Log.d("ChildTest", "func(char value):" + value);
}
// public void func(int value) {
// Log.d("ChildTest", "func(int value):" + value);
// }
};
ChildTest test = new ChildTest();
test.func(3);
test.func(4.0f);
test.func('c');
输出结果为:
D/Test: func(int value):3
D/Test: func(float value):4.0
D/ChildTest: func(char value):c
若将上例中ChildTest中被注释掉的func(int value)加上,则输出结果为:
D/ChildTest: func(int value):3
D/Test: func(float value):4.0
D/ChildTest: func(char value):c
C++中子类会直接覆盖父类所有的同名函数,无论参数是否相同。
先来看一个例子:
public class Test {
public void func(int value) {
printf("Test func(int value):%d", value);
}
}
class ChildTest extends Test {
public void func2(int value) {
printf("ChildTest func2(int value):%d", value);
}
};
ChildTest test = new ChildTest();
test->func(3);
test->func2(4);
输出结果为:
Test func(int value):3
ChildTest func2(int value):4
可以看出,由于继承的原因,子类ChildTest可以直接调用父类Test的func(int value)函数。
public class Test {
public void func(int value) {
printf("Test func(int value):%d", value);
}
}
class ChildTest extends Test {
public void func(float value) {
printf("ChildTest func(float value):%f", value);
}
};
ChildTest test = new ChildTest();
test->func(3);
输出结果为:
ChildTest func(int value):3.0000
或许我们的本意是向调用父类Test的func(int value)函数,但实际上调用的却是子类ChildTest的func(float value)函数。
在C++ Primer一书中有这样一句话:
重载函数集合中的全部函数都应在同一个域中声明。
而不同类又有各自的域,因此,在C++中子类是不能重载父类函数的。
虽然子类无法重载父类函数,但却可以通过其它方式来使用父类同名函数,来达到重载的效果。
如下例所示,我们在ChildTest中通过使用“using Test::func;”来使得Test::func函数在ChildTest中可见。
public class Test {
public void func(int value) {
printf("Test func(int value):%d", value);
}
}
class ChildTest extends Test {
using Test::func;
public void func(float value) {
printf("ChildTest func(float value):%f", value);
}
};
ChildTest test = new ChildTest();
test->func(3);
test->func(4.0f);
输出结果为:
Test func(int value):3
ChildTest func(float value):4.000000
此外,在不使用using的情况下,也可通过以下方式来调用父类的函数:
test->Test::func(3);

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
一篇关于 SaaS 的思考
与其说是一篇针对SaaS的思考,不如说是读两本书后的思考。SaaS的知名度要比 PaaS \ IaaS更高,大概是其技术门槛低,从业者众多,更容易与商业活动在一起而出名。Salesforce 作为SaaS的排头兵,为国内众多从业者的学习标杆,但国内至今没有一家有代表性的企业,将体量做的很大,或许国内企业还没有真正摸透SaaS的精髓,或许也只差那层窗户纸。 另外,技术从业者更喜欢阅读技术书,技术外的的视野会受限,建议在从事某一领域内时,也可以读读商业、管理、业务方面的书,提升提升技术格局。 推荐两本书吧,这也是读过的SaaS相关的书籍中内容比较亮眼的,作者也都有比较强的实操背景,读后让人眼前一亮,也对SaaS行业会有一个更深入的了解。 《客户成功》 客户成功的提出,打破了旧有软件销售的模式,漏斗模式更适应于买断式的软件销售,后续除维护费用外,基本不可能从客户处获取更多的收益,这是单次博弈。而客户成功模式提出沙漏模式,SaaS并非买断式,即便前期收了2-3的费用,后续继续使用依旧需要付费完成,流经漏斗后会沉淀一部分客户,如果对此部分付费客户仅以被动客户式的模式,响应客户提出的问题,与以往的...
-
下一篇
Spring Security如何优雅的增加OAuth2协议授权模式
一、什么是OAuth2协议? OAuth 2.0 是一个关于授权的开放的网络协议,是目前最流行的授权机制。 数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。 由于授权的场景众多,OAuth 2.0 协议定义了获取令牌的四种授权方式,分别是: 授权码模式:授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。 简化模式:简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。 密码模式:密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。 客户端模式:客户端模式(Client Credentials Gr...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装