【C++】继承 ③ ( 继承的一些重要特性 | 子类拥有父类的所有成员 | 多态性 | 子类可以拥有父类没有的成员 | 代码示例 )

2023-10-15 16:00:44 浏览数 (1)

一、继承的一些重要特性

1、子类拥有父类的所有成员

子类 继承 父类 , 则 子类 拥有 父类的 所有 成员变量 和 成员函数 ;

这里要注意 : 子类 拥有 父类的 私有成员 , 但是 子类不能 直接访问 父类 的 私有成员 , 必须通过 父类的 公有或受保护 的成员函数 访问 父类的 私有成员 ;

子类 不能访问 父类的 私有成员 , 并不代表 子类 中没有 父类的 私有成员 ;

下面的 Parent 父类中 , 定义了私有成员函数 privateFun ;

如果 Child 子类 继承上述 Parent 父类 , 子类中 无法直接调用 privateFun 函数 ;

如果在父类中 , 定义一个 共有成员函数 callPrivateFun 函数 , 调用 privateFun 私有函数 ;

此时 , 在 子类中 , 可以通过调用 callPrivateFun 函数 , 间接调用 父类的 privateFun 私有函数 ;

代码示例 :

代码语言:javascript复制
class Parent {
public:
    void publicFun() {
        cout << "父类公有成员" << endl;
    }
    void callPrivateFun()
    {
        privateFun();
        cout << "通过父类公有函数 调用 父类私有成员" << endl;
    }

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

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

Child 子类 继承上述 Parent 父类 , 通过 父类 callPrivateFun 函数间接调用 父类的 私有成员 ;

代码语言:javascript复制
    Child c;
    c.publicFunChild();

    // 间接调用父类的 私有成员
    c.callPrivateFun();

2、子类可以拥有父类没有的成员

子类 可以 在 继承自 父类 的 成员变量 和 成员函数 基础上 , 定义 其它的 成员变量 和 成员函数 ;

因此 , 子类 可以 拥有 父类 所没有的 成员变量 和 成员函数 ;

在下面的代码中 , Parent 是父类 , Child 是子类 ;

父类中有 publicFun , protectedFun , privateFun 三个成员方法 ;

子类中包含父类的所有成员 , 即包含上面的 publicFun , protectedFun , privateFun 三个成员方法 ,

此外 , 子类还在上面的基础上 , 又定义了 publicFunChild 方法 ;

代码语言:javascript复制
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();
    }
};

3、多态性

子类 可以 当做 父类 使用 , 子类 是 特殊的 父类 ;

在下面的代码中 , 定义了 父类 Parent 类型的变量 , Parent c2 ;

使用 Child c 对象 , 为 Parent c2 进行初始化赋值 , 代码为 Parent c2 = c , 该操作执行正常 , 并没有报错 ;

调用 c2.publicFun() 代码 , 访问 父类的 publicFun 函数 , 该操作正常执行 ;

说明 子类对象 可以当做 父类对象 使用 ;

注意 : 如果 使用 子类对象 为 父类对象 进行初始化 , 则该对象 不能调用 子类独有的成员;

部分代码示例 : 父类 与 子类 的代码 , 参考上面的章节的 Parent 父类 和 Child 子类 代码 ;

代码语言:javascript复制
    Child c;
    c.publicFunChild();

    Parent c2 = c;
    c2.publicFun();

    // c2 不能访问子类的成员
    //c2.publicFunChild();

二、代码示例


代码示例 :

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

#include <iostream>  

class Parent {
public:
    void publicFun() {
        cout << "父类公有成员" << endl;
    }
    void callPrivateFun()
    {
        privateFun();
        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();

    // 间接调用父类的 私有成员
    c.callPrivateFun();

    Parent c2 = c;
    c2.publicFun();

    // c2 不能访问子类的成员
    //c2.publicFunChild();
    

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

	return 0;
}

执行结果 :

代码语言:javascript复制
父类公有成员
父类保护成员
父类私有成员
通过父类公有函数 调用 父类私有成员
父类公有成员
Press any key to continue . . .

0 人点赞