1、问题描述

如果在基类中虚函数是public,子类中重载时标记为protected或者private函数,是否还能访问这个函数?
答案是:
基类指针指向子类时,可以访问,并且访问的是子类重载后的函数;
子类指针肯定不能访问,直接受protected、private限制。

下面测试代码演示了上面的结论,并且顺便演示了一下,基类或子类如何访问基类的虚函数。

2、测试代码
#include <QCoreApplication>
#include <QDebug>class BaseClass{public:BaseClass(){ qDebug() << "BaseClass constructor"; }virtual ~BaseClass() ;virtual void publicFun() { qDebug() << "BaseClass publicFun"; }virtual void basePublic_SubProtectedFun() { qDebug() << "BaseClass basePublic_SubProtectedFun"; }virtual void basePublic_SubPrivateFun() { qDebug() << "BaseClass basePublic_SubPrivateFun"; }protected:virtual void protectedFun() { qDebug() << "BaseClass protectedFun"; }private:virtual void privateFun() { qDebug() << "BaseClass privateFun"; }
};BaseClass::~BaseClass()
{qDebug() << "BaseClass destructor";
}class SubClass : public BaseClass{public:SubClass(){ qDebug() << "SubClass constructor"; }virtual ~SubClass() ;virtual void publicFun() { qDebug() << "SubClass publicFun"; }protected:void protectedFun() { qDebug() << "SubClass protectedFun"; }void basePublic_SubProtectedFun() { qDebug() << "SubClass basePublic_SubProtectedFun"; }private:void privateFun() { qDebug() << "SubClass privateFun"; }void basePublic_SubPrivateFun() { qDebug() << "SubClass basePublic_SubPrivateFun"; }
};SubClass::~SubClass()
{qDebug() << "SubClass destructor";
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qDebug() << "多态:基类指针指向子类,可以调用子类的保护或者私有函数";BaseClass *baseSub = new SubClass;baseSub->publicFun();baseSub->BaseClass::publicFun();baseSub->basePublic_SubProtectedFun(); //在基类中是public,所以可以调用,并且调用的是子类的protectedbaseSub->BaseClass::basePublic_SubProtectedFun();   //在基类中是public,所以可以调用,并且调用的是子类的protectedbaseSub->basePublic_SubPrivateFun();baseSub->BaseClass::basePublic_SubPrivateFun();delete baseSub;SubClass *sub = new SubClass;sub->publicFun();sub->BaseClass::publicFun();// sub->basePublic_SubProtectedFun(); //因为是保护成员函数,所以不能调用sub->BaseClass::basePublic_SubPrivateFun();// sub->basePublic_SubPrivateFun(); //因为是私有成员函数,所以不能调用sub->BaseClass::basePublic_SubProtectedFun();delete sub;return a.exec();
}

打印输出

BaseClass constructor
SubClass constructorSubClass publicFun
BaseClass publicFunSubClass basePublic_SubProtectedFun
BaseClass basePublic_SubProtectedFunSubClass basePublic_SubPrivateFun
BaseClass basePublic_SubPrivateFunSubClass destructor
BaseClass destructorBaseClass constructor
SubClass constructorSubClass publicFun
BaseClass publicFunBaseClass basePublic_SubPrivateFun
BaseClass basePublic_SubProtectedFunSubClass destructor
BaseClass destructor

【C++】多态问题:基类调用子类的protected或者private函数相关推荐

  1. 关于基类和子类构造函数的问题

    关于基类和子类构造函数的问题 情况一:在一个类无自定义构造函数时,用这个类定义一个对象a,再定义另个一个对象b时,使用b(a)这种默认的拷贝构造函数时会出错,编译器提示a没有被定义. 如下面程序: # ...

  2. 谈谈基类与子类的this指针(C++)

    引入 定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数(说明:假设存在构造函数).一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量.而对于同一个类 ...

  3. moviepy音视频剪辑:视频基类VideoClip子类VideoFileClip、CompositeVideoClip、ImageSequenceClip介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑相关类及关系>介绍了VideoClip主要有六个直接子类(VideoFileClip ...

  4. 使用“override”声明的成员函数不能重写基类成员_C++日志(三十五)虚基类与其子类的构造函数...

    第三十四篇日志中提到,子类对象调用父类同名的函数时需要使用作用域标识符进行限定,这是在任何继承情况下都可以使用的普适方法. 问题引入: 考虑一种特殊的情况:子类全部或部分的基类(称为中间基类)同是继承 ...

  5. ASP.net用法系列:如何从基类调用LINQ/EF类的属性

    如果有各种动物,比如Dogs/Cats/Cows/...,都有不同的Age方法,若想从其基类用相同的方法ShowAge来显示这些不同的Age,自然就可以借用基类Animal的virtual函数,比如: ...

  6. 为什么基类的析构函数要声明成虚函数

    记得以后基类(父类) 的析构函数最好是声明为 虚函数 即:virtual 开发中遇到了一个比较傻逼的bug,也证明了理论与实际之间的差距. 在基类中没有声明其析构函数为虚函数,导致delete 释放操 ...

  7. java 虚基类_重拾C++之虚函数和虚基类以及抽象类

    一.引言 好久没接触过C++了,今天突然要用一点感觉号蛋疼,用惯了python感觉C++一点都不会了. 声明了一个类的对象居然用这种方法,脑子绝对是被驴(python)踢了 class A{ ... ...

  8. php 继承内核中的基类,php – 从基类调用继承类的父方法

    以下示例不起作用,因为在类A中调用parent时,php会查找类A的父类,但它不存在.我宁愿这一行在B类中调用Test(). 这可能吗? (我知道这似乎是一个愚蠢的例子,但它有一个实际应用) abst ...

  9. Cpp 对象模型探索 / 虚继承带虚函数的基类的子类的内存布局

    源码 class Base { public:Base() {}virtual void func() {}int bi_; };class Son:virtual public Base { pub ...

最新文章

  1. Vue.js@2.6.10更新内置错误处机制,Fundebug同步支持相应错误监控
  2. ubuntu 运行android sdk 下的工具adb报bash: ./adb: No such file or directory
  3. MySql 自适应哈希索引
  4. 更改SYS密码,expiry_date 过期时间 没有更新,普通用户更改密码会更新
  5. 逻辑java练习_逻辑结构常见练习 Java_Note
  6. python memoryview_memoryview的用法
  7. C++如何使用MySQL数据库
  8. redhat7下对用户账户的管理
  9. 如何用while循环输出十行十列变色★☆
  10. 从零开始学Pytorch(十四)之优化算法进阶
  11. 站在信息安全角度 人脸识别面临五大问题
  12. 9day条件语句和基本数据类型
  13. [题解]一本通1240:查找最接近的元素
  14. js验证开始时间和结束时间 结束时间不能比开始时间早
  15. 安装好vmware后界面默认英语如何修改成中文或者其他语言
  16. 中国碳酸钾市场趋势报告、技术动态创新及市场预测
  17. 如何创建维恩图,用这个工具就可以了!
  18. 只是想要自己喜欢的生活,可是你有资格么?
  19. 联通、华为携手打造5G专网,解决煤矿井下作业难题
  20. 那些是html5新增元素类型,HTML5 元素分类

热门文章

  1. 在PHP中给表格加上css样式,表格CSS样式设置 给table表格设置CSS样式表
  2. linux rpm找不到命令_Linux安装软件
  3. 剑指offer:面试题14- II. 剪绳子 II
  4. windows7/10开启客户端telnet命令解决“‘telnet‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。”
  5. 设置Nginx开机自动启动(centos6.8上亲测可用)
  6. When should static_cast, dynamic_cast and reinterpret_cast be used?
  7. Python中requests包的安装
  8. 如何养出一个三十几亿身家的儿子
  9. SVN版本控制系统使用
  10. javascript数组排序和prototype详解