java赋值兼容原则,C++ 类的继承二(赋值兼容性原则)

本文探讨了C++中子类继承父类的原理,涉及赋值兼容性、内存布局与访问权限。通过实例展示了子类如何完全替代父类,但父类不能直接操作子类的所有特性。重点讲解了多继承、重名成员和类型兼容性原则,并通过代码实例验证这些概念。

//赋值兼容性原则

#include

using namespace std;

class PointA{

public:

PointA(){

x = ;

y = ;

}

void Set(){

}

private:

int x;

int y;

};

class PointB :public PointA{

public:

private:

int c;

};

/*

自己猜想:

赋值兼容性原则内部原理分析

在子类继承父类的时候,在子类的内存区域上,父类的元素会放在前面,子类的元素会放在父类元素后面

pa-> 类的-> 本质上是成员变量相对于类指针的偏移量 因为父类元素都在子类元素的前面 相当于子类前一部分就是一个父类对象

所以用父类偏移量取成员变量完全没有问题 这也说明子类继承父类,一定继承了父类的全部成员变量 包括私有成员变量

但是父类不可以代替子类 因为子类用许多父类没有的成员变量,如果按照子类的偏移量访问成员变量 就有可能访问不属于父类的内存空间

就会报错

*/

void ProtectB(PointA pin){

}

void ProtectA(){

PointA *pa = NULL;

PointB pb;

//父类可以用子类来赋值

pa = &pb;

//父类可以用子类来初始化

PointA pa1(pb);

//子类可以代替父类做形参

ProtectB(pb);

//父类可以做子类的引用

PointA &pa2 = pb;

}

//总结:子类完全可以当父类用,但是父类不可以当子类使用

void main(){

system("pause");

}

//赋值兼容性原则--原理验证

#include

using namespace std;

class PointA{

public:

PointA(){

a = ;

b = ;

}

int a;

int b;

};

class PointB{

public:

PointB(){

c = ;

}

int c;

};

class PointC :public PointA, public PointB{

public:

PointC(){

d = ;

}

int d;

};

void ProtectA(){

PointC pc;

cout << "PointC类对象的地址是" << &pc << endl;

cout << "----------------" << endl;

}

void main(){

ProtectA();

system("pause");

}

1b4ae751665bae1a7145ed705c4c191a.png

C&plus;&plus; 抽象类一(多继承与赋值兼容性原则)

//多继承与赋值兼容性原则 #include using namespace std; class Point{ public: Point(){ a = ; b = ...

C&plus;&plus;——类的继承(派生)

类的继承就是子类可以拥有父类的成员变量和成员函数 //public 修饰的成员变量 方法 在类的内部 类的外部都能使用//protected: 修饰的成员变量方法,在类的内部使用 ,在继承的子类中可用 ...

C&plus;&plus; 类的继承四(类继承中的重名成员)

//类继承中的重名成员 #include using namespace std; /* 自己猜想: 对于子类中的与父类重名的成员,c++编译器会单独为子类的这个成员变 ...

C&plus;&plus;中的赋值兼容性和重写

1,父子间的赋值兼容: 1,子类对象可以当做父类对象使用(赋值兼容性): 1,子类对象可以直接赋值给父类对象: 2,子类对象可以直接初始化父类对象: 3,父类指针可以直接指向子类对象(得到的是子类对象 ...

ios学习笔记(二)之Objective-C类、继承、类别和协议

二:Objective-C类与继承和协议 在前面已经提过了对象的初始化,这里首先讲的是变量. 2.1 变量 局部变量(内部变量): 局部变量是在方法内作定义说明的,其作用域仅限于方法内,离开方法后使用 ...

ES6学习笔记(二):教你玩转类的继承和类的对象

继承 程序中的继承: 子类可以继承父类的一些属性和方法 class Father { //父类 constructor () { } money () { console.log(100) } } c ...

c&plus;&plus;——派生类和基类转换(类型兼容性原则)

基类也叫父类,派生类也叫子类. 类之间的继承关系继承关系是类之间的父子关系. 继承关系的特点如下:A. 子类拥有父类的所有属性和行为B. 子类也是一种特殊的父类C. 子类对象可以当父类对象使用D. 子 ...

&lbrack;技术博客&rsqb;基于动态继承类、WebDriver的浏览器兼容性测试框架搭建

问题背景 观察使用selenium进行自动化测试的过程,我们可以将它概述为: 启动测试进程,在该进程中构建WebDriver 启动浏览器进程,将它与WebDriver建立连接 使用WebDriver向 ...

class&lpar;二&rpar;--派生类的继承

前言 从我之前的一篇笔记对象的继承中, 我们可以知道JS的继承方式依赖原型链,而比较好的继承方式是寄生组合式继承 先来温习下什么是寄生组合式继承 function Rectangle(length, ...

随机推荐

fwrite写入文件不成功bug

文件写入了,只是从头覆盖了!因为在fwrite():前面 文件位置指针是是SEEK_SET,即首位置.在fwrite(fileHeader, 1, 10, file); 前面加上一行fseek(fil ...

IntelliJ IDEA 12&period;0 &plus;Maven 初使用 - WEB项目的建立

新建项目 1.Fiew菜单 - New Project,选择Maven Module项,输入Project name,选择项目所在的路径,选择SDK,其余默认即可,点击Next按钮

swift3&period;0 创建一个app引导页面

swift毕竟不像是oc ,第三方的框架很多,更何况是3.0,自己动手写了个引导页面,看得上我代码的麻友可以拿去用 引导页面有三个部分构成,scrollview用语切换引导视图,pageControl ...

转:&quot&semi;在已损坏了程序内部状态的XXX&period;exe 中发生了缓冲区溢出&quot&semi;的一种可能原因

我的问题跟原作者的问题差不多.头文件和DLL不匹配导致的. 原文链接:http://blog.csdn.net/u012494876/article/details/39030887 今天软件突然出现 ...

node基础 --工具

npm  //Node.js Package Manager 查询版本号:npm --version/npm version 查询模块:npm search 查看模块相关信息 ...

firework便捷截LOGO

1.魔术棒选空白部分 2.按delete键 3.符合画布

linux系统环境变量&period;bash&lowbar;profile&sol;bashrc文件

系统环境变量的查看: [root@localhost ~]# envHOSTNAME=localhost.localdomainSELINUX_ROLE_REQUESTED=TERM=xtermSHE ...

&lbrack;LeetCode&rsqb; Falling Squares 下落的方块

On an infinite number line (x-axis), we drop given squares in the order they are given. The i-th squ ...

ELK-log4j2异步输出&plus;logstash

1.pom.xml配置文件 log4jlog4j

ubuntu 通过apt安装jdk

需要先添加ppa sudo add-apt-repository ppa:webupd8team/java sudo apt-get update 安装jdk8 sudo apt-get instal ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值