博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++多态下的访问修饰符
阅读量:5822 次
发布时间:2019-06-18

本文共 1448 字,大约阅读时间需要 4 分钟。

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;}

编译报错:

1310340-20190612093407997-1952527827.png

很显示然编译器提示我们,对于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;}

再编译一下代码,代码通过编译,我们运行一下。

1310340-20190612093431938-1524917854.png

可以看到实例化对象cB调用了类ChildB的showMsg()函数。ChildB的showMsg()函数不是私有的吗,为什么可以调用呢?

其实通过上面测试不难看出,对于C++的访问修饰符public、protected、private来说,所谓的访问修饰只是在编译器有效,编译时编译器会根据访问修饰符,检测外部调用是否合法,不合法则报错。在运行期是不做访问权限检查的,因此在多态下,子类继承于父类具有多态性质的函数,只要父类的中的访问修饰符为public, 子类中的访问修饰符不论是public,还是private,都是可以通过父类指针的形式去访问的。

转载于:https://www.cnblogs.com/chengjundu/p/11007742.html

你可能感兴趣的文章
Linux 目录结构及内容详解
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
.net excel利用NPOI导入oracle
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
hive基本操作与应用
查看>>
excel快捷键设置
查看>>
html5纲要,细谈HTML 5新增的元素
查看>>
Android应用集成支付宝接口的简化
查看>>
[分享]Ubuntu12.04安装基础教程(图文)
查看>>
django 目录结构修改
查看>>
win8 关闭防火墙
查看>>
CSS——(2)与标准流盒模型
查看>>
MYSQL 基本SQL语句
查看>>
C#中的Marshal
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
hdu 2444(二分图最大匹配)
查看>>
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>
DevOps 前世今生 | mPaaS 线上直播 CodeHub #1 回顾
查看>>
iOS 解决UITabelView刷新闪动
查看>>