C++之易混淆知识点五
一、解析类继承中父类与子类之间成员的访问可见度:
外部可见度:指的是被子类继承的父类成员在子类的外部访问控制度,有protected、public、private。
内部可见度:指的是被子类继承的父类成员在子类定义的方法中的内部访问控制度,有可访问(Y)、不可访问(N)。

class A
{
private:
void pvA();
protected:
void ptA()
public:
void pbA();
....
}
class B:public A
{
void func()
{
pvA(); //error
ptA(); //ok
pbA(); //ok
}
....
}
void g( B &b)
{
b.pvA(); //error
b.ptA(); //error
b.pbA(); //ok
}
class B:protected A
{
void func()
{
pvA(); //error
ptA(); //ok
pbA(); //ok
}
....
}
void g( B &b)
{
b.pvA(); //error
b.ptA(); //error
b.pbA(); //error
}
class B:private A
{
void func()
{
pvA(); //error
ptA(); //ok
pbA(); //ok
}
....
}
void g( B &b)
{
b.pvA(); //error
b.ptA(); //error
b.pbA(); //error
}
二、类的构造函数中调用虚方法会怎么样:
构造函数中调用了虚方法将导致运行时错误。原因是:当父类的构造函数被调用的时候,此时子类的构造函数还没有被调用,但是由于父类的构造函数中调用了虚方法,根据虚方法的实现机制,父类调用的虚方法是定义在子类中的,也就是说在此期间调用的virtual函数下降到子类阶层中,而子类的函数要使用子类的成员变量,而此时子类的成员变量还没有被初始化,这就意味着调用了一个还没有完成构造的类型对象的方法,于是就出现了调用错误。
顺便提一下:当一个类型被构造的时候,其构造顺序是:先执行成员变量的初始化表达式,然后执行父类的构造函数,最后调用类型自己的构造方法。
三、内存中分配引用类型的实质:
首先在堆栈上分配一个引用对象,在堆上分配一个对象实例,然后使得堆栈上的引用对象指向堆上的对象实例。
例如:
class person
{
private:
char *name;
int age;
public:
person(char *s,int n):name(s),age(n){}
....
}
person a=new person("Tom",24);
person b=a; //设计到深浅拷贝的问题

四、上面的语句person b=a; 设计到深浅拷贝的问题,这里的b=a是浅拷贝,也就是将对象a的引用复制一份给b,两则指向同一个实际实例,而深拷贝是完全复制对象a给对象c,也就是不仅复制引用,而且还复制实际指向的实际实例。如图深拷贝为:

C++之易混淆知识点五的更多相关文章
- Java-web易混淆知识点整理
Java-web易混淆知识点 post和get区别 post: 数据不会显示在地址栏 安全 大小无限制 可以提交二进制文件 get: 数据显示在地址栏 不安全 get方式提交有大小限制(约4kb) 相 ...
- php易混淆知识点
一.define(“constant”, “hello world”);和const constant = “hello world”;的区别? (0).使用const使得代码简单易读,const本 ...
- 【PMP】易混淆知识点
一.混淆概念 德尔菲技术 德尔菲技术是组织专家达成一致意见的一种方法.项目专家匿名参与其中.组织者使用调查问卷就重要的项目议题征询意见,然后对专家的答卷进行归纳,并把结果反馈给专家做进一步评论.这个过 ...
- C++易混淆知识点整理
// 1 /////////////////////////////////////////////////////////////////////// // 常量指针:,指针可修改,变量不可修改(只 ...
- C语言之数组与指针的易混淆知识点
一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容 ...
- C++之易混淆知识点二
1.数据抽象与封装 数据抽象是一种接口和实现相分离的编程技术,设计者关心的是如何实现这些接口,而使用者仅仅知道这些接口,抽象地考虑这些接口做什么的就可以了,不必去考虑如何实现这一层次. 封装是将低层次 ...
- CSS易混淆知识点总结与分享-定位与布局
CSS定位有四种模式:static.relative.absolute.fixed,其它static是默认值,下面分别讲解下各自的特点: static:静态定位,处于动态布局流中,按照页面中的各元素先 ...
- mysql易混淆知识点
1,join 和 union join连接属于表之间的水平操作,而union 是表之间的垂直操作.简单讲就是水平操作主要是为了获得列数据,垂直操作是为了获得行数据 cross join ...
- JavaScript易混淆知识点小回顾--数组方法与字符串方法;
数组属性: arr.length;查看数组的长度 arr.Pop;删除数组最后一个元素; 数组的方法: arr.push();添加到数组末端; arr.shift();删除数组的第一个元素; arr. ...
随机推荐
- QT线程使用收集示例
关于多线程问题: Qt和Boost做跨平台的线程封装,OpenMP主要做并行计算,让不精通多线程的人也能高效地利用CPU的计算能力.个人倾向于用boost.thread, boost.mpi. 一 ...
- <转>统计源代码行数的一些实现方法
这个问题的思考其实对于某一种语言而言,基本都能实现,只是简单和复杂而已.而此次我讨论就是只是在linux下面使用了shell和c对源代码进行行 数的讨论.本打算是实现一个python版本的,由于pyt ...
- Pycharm 设置
1:显示行号 打上对勾OK 2:设置作者 & 文件编码 3:选择切换Python的版本
- IdentityServer4-HybridAndClientCredentials
一.服务器 Client设置: new Client { ClientId = "mvc1", ClientName = "后台管理MVC客户端", Clien ...
- 洛谷P2296 寻找道路_简单BFS
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...
- centos7安装nginx(基础篇)
安装所需环境 Nginx 是 C语言 开发,建议在 Linux 上运行,当然,也可以安装 Windows 版本,本篇则使用 CentOS 7 作为安装环境. 一. gcc 安装安装 nginx 需要先 ...
- Hadoop 技术笔记
Flume与Kafka Flume 是一个分布式,可靠的,可用的服务,有效的收集,聚合和移动海量的日志数据.它有一个简单而灵活的架构,基于流数据流.具有很好的冗余和容错性,以及可靠性和多故障转移和恢复 ...
- gradle多模块构建集成swagger
1.首先说一下软件的版本:springboot:1.5.2:springcloud:D-SR1:swaager2:2.6.0:gradle:4.5.工程模块是分开的单独的entity,api,mapp ...
- python之接口继承
接口继承 接口继承就是(基类)父类定义好2个函数属性(接口),所有的子类必须有这2个函数属性,缺一不可,不是说省代码的,是用来做强制性约束的 基类里面的方法不用具体的实现,只是一个规范而已 1.1实现 ...
- Vue学习之路第十六篇:车型列表的添加、删除与检索项目
又到了大家最喜欢的项目练习阶段,学以致用,今天我们要用前几篇的学习内容实现列表的添加与删除. 学前准备: ①:JavaScript中的splice(index,i)方法:从已知数组的index下标开始 ...