51.C++继承

今天进行了新的学习关于c++继承的知识。

目录

1.继承

 基类and派生类

访问控制和继承  

单继承  

多继承  

2.同名隐藏  


1.继承

        在C++中,继承是一种面向对象编程的重要特性,用于构建类之间的层次关系。通过继承,一个类可以从另一个类继承其属性(数据成员)和方法(成员函数),从而实现代码重用和代码组织的目的。

        当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类

        继承代表了 is a(是一个的) 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物。

代码演示:

// 基类
class Animal {
    // eat() 函数
    // sleep() 函数
};
//派生类
class Dog : public Animal {
    // bark() 函数
};

 基类and派生类

        一个类可以派生多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。

访问控制和继承  

 

一个派生类继承了所有的基类方法,但下列情况除外:

  • 基类的构造函数、析构函数和拷贝构造函数。

  • 基类的重载运算符。

  • 基类的友元函数。

单继承  

        单继承是指一个派生类(子类)只能继承自一个基类(父类)。C++支持单继承,一个派生类只能有一个直接的基类。

// 基类
class Shape {
public:
    void draw() {
        // 绘制图形
    }
};
// 派生类
class Circle : public Shape {
public:
    void draw() {
        // 绘制圆形
    }
};
在上述示例中,Circle类从Shape类继承了draw()方法,并重写了该方法以实现绘制圆形的行为。

多继承  

        多继承是指一个派生类可以从多个基类继承属性和方法。C++支持多继承,一个派生类可以有多个直接的基类,用逗号分隔。

// 基类1
class A {
public:
    void methodA() {
        // 方法A
    }
};
// 基类2
class B {
public:
    void methodB() {
        // 方法B
    }
};
// 派生类继承自两个基类
class C : public A, public B {
public:
    void methodC() {
        // 方法C
    }
};
在上述示例中,C类从A类和B类继承了它们的方法,并且可以在派生类中访问methodA()、methodB()和methodC()。

2.同名隐藏  

同名隐藏(Name Hiding)是一个在 C++ 继承中需要注意的现象。当派生类中的成员与基类中的成员同名时,派生类的成员会隐藏基类中同名的成员,导致在特定的情况下无法访问基类的同名成员。这种现象发生在多级继承或多重继承中,尤其在使用指针或引用时容易出现。

#include <iostream>
class Base {
public:
    int x;

    void display() {
        std::cout << "Base: " << x << std::endl;
    }
};
class Derived : public Base {
public:
    int x;

    void display() {
        std::cout << "Derived: " << x << std::endl;
    }
};
int main() {
    Derived derivedObj;
    derivedObj.x = 10;
    derivedObj.display(); // 输出 "Derived: 10"

    derivedObj.Base::x = 5; // 使用作用域解析运算符访问基类的成员
    derivedObj.Base::display(); // 输出 "Base: 5"

    return 0;
}

        在上述示例中,Derived类继承自Base类,并且两个类都有一个同名成员x。在Derived类中,成员x会隐藏基类Base的成员x。当我们通过派生类对象访问x时,默认情况下会访问派生类中的成员x,而无法直接访问基类中的成员x。

        为了访问被隐藏的基类成员,我们可以使用作用域解析运算符 :: 来指定所属的类,如示例中的 derivedObj.Base::x 和 derivedObj.Base::display()。这样可以明确地指定使用基类中的成员,而不是派生类中的成员。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清酒。233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值