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. ...
随机推荐
- LCA 离线的Tarjan算法 poj1330 hdu2586
LCA问题有好几种做法,用到(tarjan)图拉算法的就有3种.具体可以看邝斌的博客.http://www.cnblogs.com/kuangbin/category/415390.html 几天的学 ...
- Ext未定义问题解决
做的项目用到EXT.NET,调试时候没问题,发布到IIS上出现EXT未定义,把项目的应用程序池改为Classic 模式就可以了.
- 我的新书《计算机图形学基础(OpenGL版)》
我的新书<计算机图形学基础(OpenGL版)>今年6月份在清华大学出版社出版了!新书与原在机械工业出版社出的<计算机图形学>相比,主要有以下不同: 1.加重OpenGL的内容, ...
- springmvc 中配置aop
之前自己搭建了springmvc+spring+mybaits/hibernate 的框架,并在applicationcontext.xml中配置了aop,但 发现aop根本不生效,而不用框架的话则可 ...
- RabbitMQ学习之Flow Control
当RabbitMQ发布消息速度快于消费速度或者系统资源不足时,RabbitMQ将降低或阻断发布消息速度,以免服务器资源饱满而宕机,可以通过rabbitmqctl和web管理页面查看连接的状态为flow ...
- Swift 中实现 Promise 模式
在异步编程中,除了竟态处理.资源利用以外,另外一个难点就是流程管理.在拥有匿名函数.闭包这些特性的编程语言中,我们通常可以使用回调函数来做一个异步任务完成或失败时的处理.但当我们的业务逻辑逐渐复杂时, ...
- 洛谷P1850 换教室_数学期望_Floyd
调了一下午QAQ-让我对数学期望的理解又提升了一个层次. 首先,我们发现 v<=300v<=300v<=300 , 这样我们就可以用 FloydFloydFloyd 算法来 O(n3 ...
- Java Mybatis 缓存介绍
0 引言 本文主要介绍有关MyBatis的缓存. 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 1. 一级缓存: 基于PerpetualCache 的 HashMap本 ...
- cent os 安装mariaDB / mySQL 之后初始化的命令
#安装mysql mysql-server,默认安装的是开源的mariaDB和它的server,mariadb-server,安装源中可能有找不到的,就换个名字再找找 yum install -y ...
- RESTful API设计方法
1.如果已经开始逐步的接触到了RESTful API设计方法的朋友,首先要对HTTP/HTTPS有一个大致的了解,虽然本身和RESTful API没有什么关系.但是对于增加网站的安全性还是十分重要的, ...