第47课 父子间的冲突

1. 父子间的冲突

(1)子类可以定义父类中的同名成员

(2)子类中的成员将隐藏父类中的同名成员(同名覆盖)

(3)父类中的同名成员依然存在于子类中

(4)通过作用域分辨符(::)访问父类中的同名成员

【编程实验】同名成员变量深度分析

#include <iostream>
#include <string>
using namespace std;

class Parent
{
public:
    int mi;

    Parent()
    {
        cout << "Parent(): &mi = " << &mi << endl;
    }
};

class Child : public Parent
{
public:
    int mi;

    Child()
    {
        cout << "Child() : &mi = " << &mi << endl;
    }
};

int main()
{
    Child c;

    c.mi = 100;          //子类中的mi

    c.Parent::mi = 1000;  //父类中的mi,被隐藏,须加作用域分辨符访问

    cout <<"&c.mi = " << &c.mi << endl;
    cout <<"c.mi = " << c.mi << endl;

    cout <<"&c.Parent::mi = " << &c.Parent::mi << endl;
    cout <<"c.Parent::mi = " << c.Parent::mi << endl;    

    return 0;
}
/*输出结果:
Parent(): &mi = 0x23fea8
Child() : &mi = 0x23feac
&c.mi = 0x23feac
c.mi = 100
&c.Parent::mi = 0x23fea8
c.Parent::mi = 1000
*/

2. 再论重载

(1)重载函数的本质多个不同的函数

(2)函数名参数列表是唯一的标识

(3)函数重载必须发生在同一个作用域中

3. 父子间的函数重载

(1)子类中的函数将隐藏父类的同名函数

(2)子类无法重载父类中的成员函数

(3)使用作用域分辨符访问父类中的同名函数

(4)子类可以定义父类中完全相同的成员函数

【编程实验】父子间的函数重载

#include <iostream>
#include <string>
using namespace std;

class Parent
{
public:
    int mi;

    void add(int v)
    {
        mi += v;
    }  

    void add(int a, int b)  //Parent中的两个add构成重载关系
    {
        mi += (a + b);
    }
};

/*
1、child中的3个add函数构成了重载关系
2、因child出现了以add命名的函数(只要有1个与父类同名的函数),所以父类的所有名为add的函数
   在子类中都会被隐藏起来
*/
class Child : public Parent
{
public:
    int mi;

    void add(int v)
    {
        mi += v;
    }

    void add(int x, int y, int z)
    {
        mi += (x  + y + z);
    }
};

int main()
{
    Child c;

    c.mi = 100;          //子类中的mi

    c.Parent::mi = 1000;  //父类中的mi,被隐藏,须加作用域分辨符访问

    cout <<"c.mi = " << c.mi << endl;   //100
    cout <<"c.Parent::mi = " << c.Parent::mi << endl;    //1000

    c.add(1);             //子类的add
    c.Parent::add(2, 3);  //父类的add,在子类中被隐藏,须加作用域访问符
    c.add(4, 5, 6);       //子类的add

    cout << endl;

    cout <<"c.mi = " << c.mi << endl;  //116
    cout <<"c.Parent::mi = " << c.Parent::mi << endl;  //1005

    return 0;
}

4. 小结

(1)子类可以定义父类中的同名成员

(2)子类中的成员将隐藏父类中的同名成员

(3)子类和父类中的函数不构成重载关系

(4)子类可以定义父类中完全相同的成员函数

(5)使用作用域分辨符访问父类中的同名成员

时间: 2024-11-03 21:07:19

第47课 父子间的冲突的相关文章

C++--继承中的构造与析构、父子间的冲突

一.继承中的构造与析构 Q:如何初始化父类成员?父类构造函数与子类构造函数由什么关系?A.子类对象的构造1.子类在可以定义构造函数2.子类构造函数--必须对继承而来的成员进程初始化(直接通过初始化列表或者赋值的方式进行初始化,调用父类构造函数进行初始化)B.父类构造函数在子类中的调用方式1.默认调用--适用于无参构造函数和使用默认参数的构造函数2.显示调用--通过初始化列表进行调用,适用于所有父类构造函数代码示例 #include <iostream> #include <string&

父子间的冲突(四十)

我们学习了继承,那么现在就有一个问题了:子类中是否可以定义父类中的同名成员呢?如果可以,那么将如何区分?如果不可以,为什么呢?我们来用代码说明,看看是否支持 #include <iostream> #include <string> using namespace std; class Parent { public:     int mi; }; class Child : public Parent { public:     int mi; }; int main() {  

echarts与TmodJS的冲突 -- 模块化加载器之间的冲突

前些日子写了一篇关于腾讯模板引擎TmodJS的文章<模板引擎artTemplate及模板预编译器TmodJS的使用入门>,算是对其原理与使用进行了初步的接触与研究.近期在一个项目中对TmodJS进行了尝试,未曾想无意中居然发现了TmodJS与百度图表神器Echarts之间存在一个看似不能共存的冲突. 问题是这样的:项目的某个页面中同时显式地引入了Echarts的主文件“echarts.js”以及TmodJS的依赖文件“require.js”.当执行到TmodJS所需的require()方法时,

vue组件父子间通信之综合练习--假的聊天室

<!doctype html> <html> <head> <meta charset="UTF-8"> <title>组件父子间通信之综合练习</title> <script src="js/vue.js"></script> </head> <body> <div id="container"> <p>

vue2.0非父子间进行通讯

在vue中,父组件向之组件通讯使用的是props,子组件向父组件通讯使用的是$emit+事件,那非父子间的通讯呢,在官方文档上只有寥寥数笔, 概念很模糊,这个空的vue实例应该放在哪里呢,光放文档并没有明确的描述,经过查证一些其他的资料,发现其实这个非父子间的通讯是这么用的: 首先,这个空的实例需要放到根组件下,所有的子组件都能调用,即放在main.js下面,如图所示: import Vue from 'vue' import App from './App' import router fro

vue的父子组件间传值以及非父子间传值

Vue组件间的传值方式: 父传子 子传父 非父子间传值 1.首先父组件传值给子组件,使用bind绑定属性,然后在子组件用props接收属性值. //父组件 <template> <input type="text" /> <br/> <child :inputValue="inputValue"></child> </template> <script> import child f

20190904_ 警告 发现同一依赖程序集的不同版本间存在冲突。

错误原因: 严重性 代码 说明 项目 文件 行 禁止显示状态警告 发现同一依赖程序集的不同版本间存在冲突.请将项目文件中的“AutoGenerateBindingRedirects”属性设置为 true.有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=294190. ControlItech6433 其实微软的报错消息已经非常清楚了: 项目文件中的“AutoGenerateBindingRedirects”属性设置为 true 打开你的项目 *

父子间通信四 ($dispatch 和 $broadcast用法)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js测试父子之间通信</title> <script type="text/javascript" src="lib/boot.js"></script> <style> .box{

第75课 多线程间的互斥(上)

1. 生产消费者问题 (1)问题描述 ①有n个生产者同时制造产品,并把产品存入仓库中 ②有m个消费者同时需要从仓库中取出产品. (2)规则 ①当仓库未满,任意生产者可以存入产品. ②当仓库未空,任意消费者可以取出产品. 2. 生活中的例子 ①线程间除了时序上可能存在依赖,还可能读写共享资源时存在依赖. ②洗手间的使用 ③"十字路口" 3. 多线程间的互斥 (1)临界资源(Critical Resource):每次只允许一个线程进行访问(读/写)的资源.(注意,这与Windows下的临界