首页 > 编程语言 >C++继承权限

C++继承权限

时间:2024-11-16 23:14:48浏览次数:3  
标签:权限 继承 子类 C++ class int 父类 public

目录

1.相关概念 

2.继承权限

private:

protected

public:

3.继承中的构造函数与析构函数

4.继承同名成员的处理方式

5.多继承


1.相关概念 

 定义:允许一个类继承另外一个类的属性和方法。

  好处:可以减少一些重复性的代码

  语法:class A  : 继承权限  B

                B被叫做父类或者基类

                A被叫做子类或者派生类

2.继承权限

1.凡是基类私有的,派生类都不可以访问

2.基类中除了私有的成员,其他成员在派生类中的访问属性总是以安全性高的方式呈现

3.继承权限会缩小父类在子类中的的权限,不会扩大成员的权限(权限由高到低:public、protected、private)

private:

#include<iostream>
using namespace std;
class father {
public:
    int pub;
protected:
    int pro;
private:
    int pri; // 只是被隐藏了,会被一直继承下去
};
// 以私有的方式继承父类,父类中的所有成员在子类中的权限都是私有的
// son继承了father,father中包含的son中也包含
class son : private father {
    void fun() {
        pub = 2;//从共有的变为私有
        pro = 2;//从受保护的变为私有
        //   pri = 3;//不可以被访问,因为在在父类中是私有的
    }
};
// 因为son是以私有的方式继承father,所以father中的成员
//在son中都是私有的,所以son的子类不能访问到pro和pub 
class grandson : public son {
    void fun() {
        // pro = 2;
        // pub = 2;
    }
};
int main()
{
    cout << "类father的大小为:"<<sizeof(father) << endl;
    cout << "类son的大小为:" << sizeof(son) << endl;
    cout << "类grandson的大小为:" << sizeof(grandson) << endl;
    return 0;

}

关于继承的权限可以看代码,在这里强调一下,如果父类中有私有的成员,子类也是会继承的,只是被隐藏了,千万不要以为父类中是私有的,就不会被继承。我们可以通过打印这个类的大小来确认。

protected

class father {
public:
    int pub;
protected:
    int pro;
private:
    int pri;
};
// 以受保护的方式继承,那么father中的共有成员
//在son中的访问权限是受保护的
class son : protected father {
    void fun() {
        pub = 2; // 从共有的变为受保护的
        pro = 2; // 仍然是受保护的
        //  pri = 3;//不可以被访问,因为在在父类中是私有的
    }
};

class grandson : protected son {
    void fun() {
        // 因为是受保护的,所以可以访问
        pro = 2;//受保护的
        pub = 2;//受保护的
    }
};

public:

class father {
public:
    int pub;
protected:
    int pro;
private:
    int pri;
};
// 以共有的方式继承,子类的权限不变
class son : public father {
    void fun() {
        pub = 2; // 共有的
        pro = 2; // 仍然是受保护的
        //  pri = 3;//不可以被访问,因为在在父类中是私有的
    }
};

class grandson : public son {
    void fun() {
        pro = 2;
        pub = 2;
    }
};

3.继承中的构造函数与析构函数

子类继承父类后,创建子类对象时,也会调用父类的构造函数

先调用父类的构造函数,然后调用自身的构造函数,析构函数的顺序相反。

#include <iostream>
using namespace std;
class A {
public:
    int num;
    A() { cout << "父类的构造" << endl; }
    ~A() { cout << "父类的析构" << endl; }
};
class B : public A {
public:
    B() { cout << "子类的构造" << endl; }
    ~B() { cout << "子类的析构" << endl; }
};
int main() {
    B b;
    return 0;
}

例如上述代码的运行结果为:

4.继承同名成员的处理方式

当子类和父类出现同名的成员,可以通过以下两种访问

        1.访问子类同名成员 直接访问即可

        2.访问父类同名成员 需要加作用域

#include <iostream>
using namespace std;
/*
    当父类和子类中有同名函数时,子类中的函数会将父类中的同名函数隐藏
    如果此时想通过子类对象访问父类对象,需要作用域
    父类对象不可以访问子类对象中的成员变量,因为创建父类对象不会创建子类对象
*/
class A {
public:
    int num;
    A(int val) { cout << "类A的有参构造" << endl; }
    void fun() {
        cout << num << endl;
        cout << "A" << endl;
    }
};
class B : public A {
public:
    int num;
    // 如果父类中没有无参构造函数,可以在子类的初始化参数列表中调用父类的构造函数
    B(int val) : A(val) { cout << "类B的有参构造" << endl; }
    void fun() {
        cout << num << endl;
        cout << "B" << endl;
    }
};
int main() {
    B b(2);
    b.num = 2;    // 此时的num是类B中的num
    b.fun();      // 调用的是类B中的fun函数
    b.A::num = 3; // 类A中的num
    b.A::fun();   // 类A中的fun函数
    return 0;
}

5.多继承

在C++中是允许一个类继承多个类的

语法:class 子类:继承方式 父类1,继承方式 父类2......

多继承可能会引起父类中的同名成员的出现,需要加作用域区分

#include <iostream>
using namespace std;
class A {
public:
    int num;
};
class B {
public:
    int num;
};
class C : public A, public B {
public:
};
int main() {
    C c;
    c.A::num = 2; // 通过作用域解决多继承中的二义性问题
    return 0;
}

例如在上述代码中,让类C以共有的方式继承了类A和类B,此时类A和类B都有一个叫做num的成员变量,类C中都可以访问到这两个对象,如果c.num访问时,就会报二义性的错误,编译器不知道这个num是类A中的num还是类B中的num,所以此时需要加作用域区分。

标签:权限,继承,子类,C++,class,int,父类,public
From: https://blog.csdn.net/gemluoye/article/details/143800896

相关文章

  • 数据结构与算法刷题(参考代码随想录结构,C、C++实现)
    目录数组数组理论基础二分查找移除元素有序数组的平方长度最小的子数组螺旋矩阵Ⅱ总结篇链表1.链表理论基础2.移除链表元素3.设计链表4.反转链表5.两两交换链表中的节点6.删除链表的倒数第N个节点7.链表相交8.环形链表Ⅱ9.总结篇哈希表1.哈希表理论基础2.有效的字母异位词3.两个数......
  • 【C++复习】栈-下篇
    大家好,这里是不会写开场白的Yinph。今天我们先来复习一下中缀表达式、前缀表达式和后缀表达式,以及如何用栈来实现它们之间的运算。一、中缀表达式‌‌中缀表达式‌是一种算术或逻辑公式的表示方法,其中操作符位于操作数的中间。这种表示方法符合人们的日常书写习惯,因此被广泛使......
  • 【C++】static(静态)
    类外静态变量或函数意味着,当需要将这些变量或函数与实际定义的符号链接时,链接器不会在这个翻译单元的作用域之外寻找那个符号定义,即只会在这个翻译单元内部链接(文件内可用)如果这句话并不理解,可以看一下【C++】HowtheC++CompilerWorks和【C++】HowtheC++LinkerWork......
  • 根据二叉树的前序和中序构建树,并按层次输出(C++)vector存树
    L2-006树的遍历#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;#defineendl'\n'intpo[35];intino[35];vector<int>ans[50];intdfs(intl1,intr1,intl2,intr2){ for(inti=l2;i<=r2;i++){ if......
  • 【C++进阶实战】个人财务管理系统
    功能说明添加收入和支出记录:用户可以添加新的收入和支出记录。查看记录:用户可以查看所有的收入和支出记录。生成财务报告:用户可以生成总收入、总支出和剩余金额的报告。设定预算:用户可以设定每月的预算,并查看是否超出预算。文件存储:使用文件来存储记录,以便下次启动程序时仍然......
  • 【C++进阶实战】电子词典
    功能说明查询单词:用户可以输入一个单词,程序将显示该单词的释义。文件存储:使用文件来存储单词和释义,以便下次启动程序时仍然可用。用户界面:提供简单的命令行界面,让用户选择查询单词或退出程序。示例代码词库文件 dictionary.txt假设我们有一个词库文件dictionary.txt,内容......
  • 穿越数据迷宫:C++哈希表的奇幻旅程
    文章目录前言......
  • Wincc 7.5SP1下VBA编程练习:批量设置看见权限
    这一篇学习笔记我在新浪发表过,那边还在审核。在这里也记录一下。前两天QQ群里面有人询问能不能快速的给WINCC画面上的控件设置操作权限,这个是比较容易的。比如有个画面有10个IO域,在VBA编辑器写下面的脚本:SubIOField_PropertyTrigger1()DimobjectsDimobjDimobjdynamicDi......
  • [C++] 智能指针
    文章目录智能指针的使用原因及场景分析为什么需要智能指针?异常抛出导致的资源泄漏问题分析智能指针与RAIIC++常用智能指针使用智能指针优化代码优化后的代码优化点分析析构函数中的异常问题解决方法RAII和智能指针的设计思路详解什么是RAII?RAII的工作原理智能......
  • 【C++】深入理解自定义 list 容器中的 list_iterator:迭代器实现详解
    个人主页:起名字真南的CSDN博客个人专栏:【数据结构初阶】......