C++多态下的访问修饰符
C++多态下的访问修饰符
先上代码:
class Parent
{
public:
virtual void showMsg()
{
cout << "Parent showMsg()" << endl;
}
};
class ChildA : public Parent
{
public:
void showMsg() override
{
std::cout << "ChildA showMsg()" << std::endl;
}
};
class ChildB : public Parent
{
private:
void showMsg() override
{
std::cout << "ChildB showMsg()" << std::endl;
}
};
在这段代码里我们先定义了一个Parent类,然后定义了2个继承于它的子类ChildA和ChildB。
我们在Parent类中声明且实现了一个名为showMsg()的函数,且此函数为虚函数,允许子类重写。我们在子类ChildA和ChildB中均重写了此函数,唯一不同的是ChildA中showMsg()函数的访问修饰符为public,ChildB中showMsg()的访问修饰符为private。我们知道public和private两个访问修饰符的区别是,public修饰符下函数允许外部访问,而private修饰符下的函数不允许外包访问(当然友元函数和友元类可以访问)。
我们测试一下:
int main()
{
ChildA* cA = new ChildA;
cA->showMsg();
ChildB* cB = new ChildB;
cB->showMsg();
delete cB;
cB = nullptr;
delete cA;
cA = nullptr;
return 0;
}
编译报错:
很显示然编译器提示我们,对于ChildB类,showMsg()函数是私有的,不能访问。
我们修改一下测试代码:
int main()
{
ChildA* cA = new ChildA;
cA->showMsg();
Parent* cB = new ChildB;
cB->showMsg();
delete cB;
cB = nullptr;
delete cA;
cA = nullptr;
return 0;
}
再编译一下代码,代码通过编译,我们运行一下。
可以看到实例化对象cB调用了类ChildB的showMsg()函数。ChildB的showMsg()函数不是私有的吗,为什么可以调用呢?
其实通过上面测试不难看出,对于C++的访问修饰符public、protected、private来说,所谓的访问修饰只是在编译器有效,编译时编译器会根据访问修饰符,检测外部调用是否合法,不合法则报错。在运行期是不做访问权限检查的,因此在多态下,子类继承于父类具有多态性质的函数,只要父类的中的访问修饰符为public, 子类中的访问修饰符不论是public,还是private,都是可以通过父类指针的形式去访问的。
C++多态下的访问修饰符的更多相关文章
- C#面向对象 (访问修饰符、封装、继承、多态)
先看一下创建一个新项目时的基本格式 using System; using System.Collections.Generic; using System.Linq; //引用的命名空间 using ...
- Java访问修饰符和三大特征(封装,继承和多态)
一.访问修饰符基本介绍: java提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围): 1.公开级别:用public修饰,对外公开2.受保护级别:用protected修饰,对子 ...
- 20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)
1:C#中的访问修饰符 public: 公共成员,完全公开,没有访问限制. private: 私有的,只能在当前类的内部访问. protected: 受保护的,只能在当前类的内部以及该类的子类中访问. ...
- 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)
访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...
- 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)
译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 相关文档:http://files.cnblogs.c ...
- Java访问修饰符(访问控制符)
Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...
- 【.Net】 C#访问修饰符
一 类的修饰符: C#中类的默认修饰符是internal.1 private 只有对包.NET中的应用程序或库才能访问.2 public 不限制对类的访问. 3 protected 只可以被本类和其 ...
- Java_关键字、匿名对象、内部类、访问修饰符、代码块
final关键字 概述: 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后, ...
- JAVA知识总结(三):继承和访问修饰符
今天乘着还有一些时间,把上次拖欠的面向对象编程三大特性中遗留的继承和多态给简单说明一下.这一部分还是非常重要的,需要仔细思考. 继承 继承:它是一种类与类之间的关系,通过使用已存在的类作为基础来建立新 ...
随机推荐
- 阿里云视频云正式支持AV1编码格式 为视频编码服务降本提效
今天我们要说的 AV1 可不是我们平时说的 .AVI 文件格式,它是由AOM(Alliance for Open Media,开放媒体联盟)制定的一个开源.免版权费的视频编码格式,可以解决H.265昂 ...
- Zookeeper w3cschool教程
1.简介 ZooKeeper是一种分布式协调服务,用于管理大型主机.在分布式环境中协调和管理服务是一个复杂的过程.ZooKeeper通过其简单的架构和API解决了这个问题. ZooKeeper允许开发 ...
- Prototype js library
Prototype An object-oriented JavaScript framework Prototype is a JavaScript framework that aims to e ...
- buildroot
http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2 简介 buildroot是一个Makefiles和 ...
- python进行数据库迁移的时候显示(TypeError: __init__() missing 1 required positional argument: 'on_delete')
进行数据库迁移的时候,显示 TypeError: __init__() missing 1 required positional argument: 'on_delete' 图示: 出现原因: 在 ...
- (转) intellij idea部署web项目时的位置(Tomcat)
这篇文章说的比较好: 原文地址:https://blog.csdn.net/zmx729618/article/details/78340566 1.当你项目启动的时候console能看到项目运行的位 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_8_使用try_catch_finally处理流中的异常
变量没有初始化的赋值 变量可能赋值会失败.设置fw为null.close报错 把close也用try catch捕获异常 修改写入w盘.实际盘符没有这个 上面异常是这里打印的 继续优化代码
- JDBC 国际标准时间
mysql.driver=com.mysql.cj.jdbc.Drivermysql.url=jdbc:mysql://localhost:3306/XXXX?characterEncoding=UT ...
- 【ABAP系列】SAP ABAP实现发送外部邮件(添加附件)功能
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP ABAP实现发送外部邮件(添 ...
- 006/搭建fabric(二)
准备vmware虚拟机,并安装完ubuntu系统后.继续搭建fabric运行环境... 0.打开终端,切换root身份.目的:后续操作即可不用sudo... 右键->open Terminal- ...