C++ 继承(一)

本文详细介绍了面向对象编程中的继承概念,包括公有、私有和保护继承,以及它们在代码复用、功能扩展和多态性上的作用。通过C++代码示例展示了不同类型的继承如何影响类成员的访问权限。
摘要由CSDN通过智能技术生成

一、继承的概念

继承是面向对象编程中的一个重要概念,它指的是一个类(子类)可以从另一个类(父类)继承属性和方法。子类继承父类的属性和方法后,可以直接使用这些属性和方法,同时也可以在子类中添加新的属性和方法,或者对父类的方法进行重写。继承的作用主要包括:

1、代码复用:通过继承,子类可以重用父类的代码,避免重复编写相同的代码,提高了代码的复用性和可维护性。

2、扩展功能:子类可以在继承父类的基础上,添加新的属性和方法,实现对父类功能的扩展。

3、多态性:继承是实现多态性的一种方式,通过父类引用指向子类对象,可以实现对不同子类对象的统一操作

二、继承公有操作

三种继承方式

公有继承(public inheritance)

私有继承(private inheritance)

保护继承(protected inheritance)

公有继承是应用更广泛的继承操作,它直接将父类的权限复制到子类中(不存在权限降级)。

注:在公有继承中,子类不可以访问父类的私有成员(private),只能通过父类提供的公有接口进行访问。

代码示例:父类为动物,子类分别是猫和狗,其中name(名字)和age(年龄)为复用项,color(颜色)为狗的扩展项,breed(品种)为猫的扩展项。

#include <iostream>
#include <string>

using namespace std;

class Animal{
    public:
        string name;
        int age;

        void eat()
        {
            cout<<"在吃饭"<<endl;
        }
        void sleep()
        {
            cout<<"在睡觉"<<endl;
        } 
};

class Dog:public Animal{
    public:
        string color;
        void lookhone()
        {
            cout<<name<<"在看家"<<endl;
        }
        //继承扩展
        void eat()
        {
            cout<<name<<"津津有味的啃着骨头"<<endl;
        }
        void sleep()
        {
            cout<<name<<"在狗窝里睡觉"<<endl;
        }
};

class Cat:public Animal{
    public:
        string breed;//品种
        void catchMouse()
        {
            cout<<name<<"在抓老鼠"<<endl;
        }
        void eat()
        {
            cout<<name<<"卯着劲的吃着猫粮"<<endl;
        }
        void sleep()
        {
            cout<<name<<"在猫窝里呼呼大睡"<<endl;
        }
};
int main()
{
    //创建Dog对象
    Dog dog;
    dog.name = "旺财";
    dog.age = 2;
    dog.color = "土黄色";
    dog.eat();
    dog.sleep();
    dog.lookhone();

    //创建Cat对象
    Cat cat;
    cat.name = "喵喵";
    cat.age = 1;
    cat.breed = "橘猫";
    cout<<"猫名:"<<cat.name<<endl;
    cout<<"猫龄:"<<cat.age<<endl;
    cout<<"品种:"<<cat.breed<<endl;
    cat.eat();
    cat.catchMouse();
    cat.sleep();

    return 0;
}

运行结果:

旺财津津有味的啃着骨头
旺财在狗窝里睡觉
旺财在看家
猫名:喵喵
猫龄:1
品种:橘猫
喵喵卯着劲的吃着猫粮
喵喵在抓老鼠
喵喵在猫窝里呼呼大睡

三、继承私有操作

派生类继承基类的成员,但这些成员在派生类中的访问权限是私有的,外部无法直接访问。

派生类可以访问基类的公有成员和保护成员,但外部代码无法访问这些成员。

私有继承会造成继承的子类的成员变量降级为private,导致子类和其他类都不能直接使用。

代码示例:

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

class Father{
    public:
        int a;
        void fun1()
        {
            cout<<"父类的公共方法"<<endl;
        }
    protected:
        int b;
        void fun2()
        {
            cout<<"父类的受保护方法"<<endl;
        }
    private:
        int c;
        void fun3()
        {
            cout<<"父类的私有方法"<<endl;
        }
};

class Son3:private Father{
    public:
        void fun()
        {
            a = 10;
            b = 20;
            // c = 30;报错,父类私有子类不能访问
            fun1();//private,权限降级
            fun2();
            // fun3();报错,父类私有子类不能访问
        }
};

int main()
{
    Son3 s3;
    //s3.a=10; a在子类中已经降级为private
    //s3.b=20; b在子类中已经降级为private
    //s3.c=30; c本来就是private
    s3.fun();
    return 0;
}

运行结果:

父类的公共方法
父类的受保护方法

四、保护继承

在C++中,使用protected访问修饰符可以实现保护继承,被protected修饰的成员可以被派生类继承,但不能被外部访问。

代码示例:

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

class Father{
    public:
        int a;
        void fun1()
        {
            cout<<"父类的公共方法"<<endl;
        }
    protected:
        int b;
        void fun2()
        {
            cout<<"父类的受保护方法"<<endl;
        }
    private:
        int c;
        void fun3()
        {
            cout<<"父类的私有方法"<<endl;
        }
};

class Son2:protected Father{
    public:
        void fun()
        {
            a = 10;
            b = 10;
            // c = 30;
            fun1();//protected,权限降级
            fun2();
            //fun3();
        }
};

int main()
{
    Son2 s2;
    // s2.a = 10
    // s2.b = 10;
    // s3.c = 30;

    s2.fun();
    return 0;
}

运行结果:

父类的公共方法
父类的受保护方法
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值