【C++】继承 ② ( 继承语法 | 三种继承 - 共有继承 / 保护继承 / 私有继承 | 继承与父类私有成员 | 子类访问父类私有成员 | 代码示例 )

2023-10-15 16:00:24 浏览数 (2)

一、继承语法

1、语法说明

继承语法 : 使用 class 关键字 定义 子类 , 在 子类后面 使用 冒号 : 与 若干父类隔开 ;

代码语言:javascript复制
class 子类名称 : 父类列表
{
	// 子类成员
};

父类列表格式 : 上述 " 父类列表 " 的格式如下 , 父类列表 由 若干父类组成 , 可以是 一个 , 也可以是 多个 ;

代码语言:javascript复制
访问控制 父类名称 , 访问控制 父类名称 , ... , 访问控制 父类名称 ; 

2、三种继承 - 共有继承 / 保护继承 / 私有继承

访问控制符 : 访问控制符 用于 设置 继承的方式 ;

  • public : 公有继承
    • Child 类继承了 Parent 类的所有公有和保护成员 , 访问级别不变 , 并且可以访问它们 ;
    • Child 类不能继承 Parent 类的私有成员 ;
  • protected : 保护继承
    • Child 类继承了 Parent 类的所有公有和保护成员 , 这些成员会被声明为 保护成员 , 只能在类内部 或 子类中 访问它们 ;
    • Child 类不能继承 Parent 类的私有成员 ;
  • private : 私有继承
    • Child 类继承了 Parent 类的所有公有和保护成员 , 这些成员会被声明为私有的 , 只能在类内部访问它们 ;
    • Child 类不能继承 Parent 类的私有成员 ;

3、继承与父类私有成员

C 的 三种继承

  • 公有继承 public
  • 保护继承 protected
  • 私有继承 private

只针对 父类 的 " 公有成员 " 和 " 保护成员 " , 这两种成员是可以被继承的 ;

父类的 " 私有成员 " 是无法被子类 继承 和 访问 的 ; 父类的 私有成员 只能在 父类中 , 由父类自己的成员访问 ;

除 父类 之外的任何类 , 包括子类 , 都不能访问 父类的 私有成员 , 这是为了保护 类的 封装性 和 安全性 而制定的规则 ;

4、子类访问父类私有成员

子类 不能直接访问 父类的 私有成员 ,

但是可以通过在 父类 中提供 公有 或 保护 的 成员函数 来访问这些私有成员 ;

这些成员函数可以在子类中重写或复用 , 以便让子类能够访问和操作基类的私有成员 ;

如果在 子类 中 尝试访问 父类 的 私有成员 , 会报如下错误 :

代码语言:javascript复制
Test.cpp(34,1): error C2248: “Parent::privateFun”: 无法访问 private 成员(在“Parent”类中声明)
Test.cpp(18): message : 参见“Parent::privateFun”的声明
Test.cpp(6): message : 参见“Parent”的声明

二、代码示例 - 继承语法


代码示例 :

代码语言:javascript复制
#include "iostream"
using namespace std;

#include <iostream>  

class Parent {
public:
    void publicFun() {
        cout << "父类公有成员" << endl;
    }

protected:
    void protectedFun() {
        cout << "父类保护成员" << endl;
    }

private:
    void privateFun() {
        cout << "父类私有成员" << endl;
    }
};

// 子类 公有继承 父类
class Child : public Parent {
public:
    void publicFunChild() {
        // 子类 可以访问 父类 的公有成员 
        publicFun();   

        // 子类 可以访问 父类 的保护成员 
        protectedFun();

        // 任何类型的继承 都不能访问 父类的私有成员
        //privateFun();
    }
};

int main() {

    Child c;
    c.publicFunChild();

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :

代码语言:javascript复制
父类公有成员
父类保护成员
Press any key to continue . . .

0 人点赞