//类继承中的重名成员
#include<iostream>
using namespace std; /*
自己猜想: 对于子类中的与父类重名的成员,c++编译器会单独为子类的这个成员变量再开辟一块内存空间,
把这个重名的成员变量当成子类的独有属性
在子类对象中如果访问重名成员,会默认访问子类独有那个成员变量,而不是访问父类的成员变量 对于从父类继承的所有成员,c++编译器会在子类对象的内存空间前部分放置父类的所有成员
父类的成员函数访问的都是 子类对象中 父类内存空间那部分的成员变量,
--如果不是这样,那么父类中能访问子类成员变量?
又因为子类对象的重名成员 是独立于父类 属于子类对象的一个成员变量 对于被子类继承的父类的成员函数 访问的是父类中的那个重名成员的解释
根据类的对象管理模型,类的非静态成员函数就是一个全局函数,只是函数中默认有一个对象指针参数
对于父类成员函数而言,父类成员函数有一个参数就是父类对象指针,
此时子类对象调用父类成员函数,不就是类的赋值兼容性原则吗--父类指针调用子类对象,
父类对象指针不强转成子类对象指针,那么这个父类指针不是只能访问父类对象的成员吗?
因此得出结论,子类对象调用继承于父类的成员函数 访问的是父类中的那个重名成员
*/ /*
总结:
派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽了基类的同名成员
在派生类中使用基类的同名成员,显式的使用类名限定符 ----- 类名::成员
*/ class PointA{
public:
int x;
int y;
void PrintA(){
cout << "x=" << x << ";y=" << y << endl;
}
void PrintB(){
cout << "x=" << x << ";y=" << y << endl;
}
}; class PointB :public PointA{
public:
PointB(){
x = ;
y = ;
z = ;
//在子类内部中给可访问父类成员属性赋值
PointA::y = ;
}
int y;
int z;
void Test1(){
cout << "z=" << z << ";y=" << y << endl;
}
void PrintB(){
cout << "z=" << z << ";y=" << y << endl;
}
}; void ProtectA(){
PointB pb1;
pb1.PrintA();
cout << "----------------" << endl;
pb1.Test1();
cout << "----------------" << endl;
pb1.y = ;
//在子类外部中给可访问父类成员属性赋值
pb1.PointA::y = ;
pb1.PrintA();
cout << "----------------" << endl;
pb1.Test1();
} void ProtectB(){
PointB pb1;
//对于重名函数调用规则和重名变量规则类似
pb1.PrintB();
cout << "--------------------" << endl;
pb1.PointA::PrintB();
} void main(){
//ProtectA();
ProtectB();
system("pause");
}

C++ 类的继承四(类继承中的重名成员)的更多相关文章

  1. c++中的重名问题

    看C++视频教程-范磊主讲(2.91G)视频学习笔记整理. 1.c++为什么要引入名字空间(namespace)? c++引入名字空间这个概念,是为了避免重名问题,比如说避免重复的函数名或者变量名引起 ...

  2. javascript函数中变量重名

    <script type="text/javascript"> function fun(a){ console.log(a); // function var a=1 ...

  3. PHP类(四)-类的继承

    类的继承就是从已经定义的类中继承数据,也可以重新定义或者加入一些数据. 被继承的类称为父类,基类,超类 继承的类称为子类,派生类 在PHP中只能使用单继承,也就是一个类只能从一个类中继承数据,但是一个 ...

  4. Java 面向对象(四)继承

    一.继承的概述(Inherited) 1.由来 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 其中,多个类可以称为 子类(派生类 ...

  5. Linux中mv重命名作用及打包war压缩文件及分配权限

    1.Linux中的重命名文件使用mv命令 touch a.txt 新建一个文件 mv a.txt b.txt 重命名文件为b.txt mkdir abc 新建一个目录 mv abc abd 重命名文件 ...

  6. Java中是否可以继承String类,为什么

    Java中,是否可以继承String类?为什么? 答案: 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变. public final class ...

  7. 《前端之路》- TypeScript (三) ES5 中实现继承、类以及原理

    目录 一.先讲讲 ES5 中构造函数(类)静态方法和多态 1-1 JS 中原型以及原型链 例子一 1-2 JS 中原型以及原型链中,我们常见的 constructor.prototype.**prot ...

  8. C++中虚继承派生类构造函数的正确写法

    最近工作中某个软件功能出现了退化,追查下来发现是一个类的成员变量没有被正确的初始化.这个问题与C++存在虚继承的情况下派生类构造函数的写法有关.在此说明一下错误发生的原因,希望对更多的人有帮助. 我们 ...

  9. C#中是否可以继承String类

    C#中是否可以继承String类? 答:String类是sealed类故不可以继承. 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. 在下面的示例中,类 HoverTree ...

随机推荐

  1. GDB高级使用方法

    1.设置环境变量 用户可以在GDB的调试环境中定义自己需要的变量,用来保存一些调试程序中的运行数据.要定义一个GDB的变量很简单,只需使用GDB的set命令. GDB的环境变量和Linux一样,也是以 ...

  2. ScriptableObject 对象化的运用

    http://www.cnblogs.com/oldman/articles/2409554.html using UnityEngine; using UnityEditor; using Syst ...

  3. honeyd蜜罐配置和web监听脚本

    Honeyd的安装和配置 Honeyd软件依赖于下面几个库及arpd工具: (1)Libevent:是一个非同步事件通知的函数库. 通过使用 libevent,开发者能够设定某些事件发生时所运行的函数 ...

  4. UG NX9.0.0 for linux安装

    自:http://vivianyw.blog.163.com/blog/static/13454742220145601415881/?latestBlog NX9.0.0 for linux安装. ...

  5. Maven--要点笔记

    --maven笔记 1.maven命令 2.archetype插件:用于创建符合maven规定的文件夹骨架   命令: mvn archetype:generate 3. 坐标:构件 仓库: 本地仓库 ...

  6. FFmpeg采集音视频数据命令

    文章转自:https://www.jianshu.com/p/4709ccbda3f9 1.ffmpeg 把文件当做直播推送至服务器 (RTMP + FLV) ffmpeg - re -i demo. ...

  7. C#:将数据网格内的数据导出到Excel

    public void ExportDataToExecel(DataGridView dataGridView1) { SaveFileDialog kk = new SaveFileDialog( ...

  8. php回调函数call_user_func和call_user_func_array详解

    call_user_func($fun); call_user_func 函数类似于一种特别的调用函数的方法,使用方法如下: 1.调用 普通函数: <?php function a($b, $c ...

  9. unity, GUI.Button texture is black

    GUI.Button(rect,tex),结果显示出来tex是黑的,原来是因为我以前在别处调用了GUI.contentColor =Color.black. 参考:http://answers.uni ...

  10. unity, 内置shader下载地址

    在unity的download页面上能找到Built in shaders的下载连接.