首页 > 编程语言 >探索C++的类与继承之美:从基础到高级

探索C++的类与继承之美:从基础到高级

时间:2024-10-30 14:45:20浏览次数:6  
标签:函数 探索 继承 之美 C++ func 基类 public

C++是一种强大的面向对象编程语言,其特性允许开发者利用类和继承来构建复杂的数据结构和功能。在本篇博客中,我们将通过一些示例代码,详细解析C++中的类、继承、虚继承、访问控制以及多重继承的概念。

类的定义与基本特性

类是C++的基本构建块,允许我们定义一个新的数据类型,该类型可以包含数据和操作这些数据的函数。以下是一个简单的类定义示例:

class A 
{
public:
    int a;
    void func() 
    {
        cout << "A::func()" << endl;
    }
};

在这个类中,a是一个公有成员变量,而func()是一个公有成员函数。公有成员可以被类的外部访问,而私有成员只能被类的内部访问。

多重继承

C++支持多重继承,这意味着一个类可以继承多个基类。以下是一个示例,其中类B和类C都继承自类A

class B : virtual public A 
{
public:
    int b;
    void func() 
    {
        cout << "B::func()" << endl;
    }
};

class C : virtual public A 
{
public:
    int c;
    void func() 
    {
        cout << "C::func()" << endl;
    }
};

class D : public B, public C 
{
public:
    void func() 
    {
        cout << "D::func()" << endl;
    }
};

虚继承

在这个例子中,类BC通过virtual关键字虚拟地继承了类A。虚继承解决了“钻石继承”问题,避免了多重继承中可能出现的二义性。当类D创建对象时,只有一个A的实例存在,这样就避免了因多重继承而造成的冗余。

int main() 
{
    D d;
    d.func();  // 输出 D::func()
    cout << "sizeof(D) = " << sizeof(D) << endl;   // 虚指针占8个字节
    return 0;
}

运行以上代码,我们可以看到,sizeof(D)的值在使用虚继承和不使用虚继承时是不同的。这是因为虚继承引入了额外的指针以维护基类的唯一性。

虚函数与动态多态

C++中的虚函数允许我们在基类中定义一个函数,并在派生类中重写该函数,从而实现运行时多态。下面是一个简单的示例:

class A
{
public:
    virtual void print()
    {
        cout << "A" << endl;
    }
};

class B : public A
{
public:
    void print() override
    {
        cout << "B" << endl;
    }
};

main函数中,我们可以创建一个B类的对象,并将其指针赋给基类A的指针:

int main()
{
    B b;
    A *a =&b;
    a->print();  // 输出 B
    return 0;
}

使用基类指针调用虚函数print(),会根据实际对象类型(即B)来决定调用哪个函数。这种特性对于实现接口和多态性非常有用。

访问控制与继承

C++提供了三种访问控制机制:公有(public)、私有(private)和保护(protected)。这些访问控制决定了类成员的可见性。在继承中,访问控制的行为会影响派生类对基类成员的访问权限。

例如:

class Test
{
    int a;         // 私有成员
public:
    int b;        // 公有成员
protected:
    int c;       // 保护成员
};

class Stu1 : private Test
{
    void show()
    {
        // a = 10; // 无法访问
        b = 20;  // 可以访问
        c = 30;  // 可以访问
    }
};

在这个例子中,Stu1通过私有继承继承了Test。这意味着Test的公有和保护成员在Stu1中都是私有的。这样,外部无法直接访问这些成员。

相对而言,保护继承则使得基类的公有和保护成员在派生类中仍然是保护的,这样可以让派生类的子类访问基类的成员。

class Stu2 : protected Test
{
    void show()
    {
        // a = 10; // 无法访问
        b = 20;  // 可以访问
        c = 30;  // 可以访问
    }
};

多重继承与函数名冲突

当多个基类中有同名函数时,派生类必须显式地指定调用哪个基类的函数。例如:

class C : public A, public B    
{
public:
    void func() 
    {
        cout << "C::func()" << endl;
    }
};

class D : public C
{
public:
  
};

int main()
{
    C c;
    c.func();        // 输出 C::func()
    c.B::func();     // 输出 B::func()
    D d;
    d.func();        // 输出 C::func()
    d.B::func();     // 输出 B::func()
    return 0;
}

在这个示例中,类C重写了func()函数,因此当调用c.func()时,会输出C::func()。如果我们想调用B中的func(),可以通过c.B::func()来实现。

结论

通过上述示例和讨论,我们深入探讨了C++中的类、继承、虚继承、虚函数及其访问控制等重要特性。理解这些概念有助于我们在实际开发中设计出更为高效、可维护的代码。多重继承虽然强大,但使用不当也可能导致复杂性,因此在设计类层次结构时需谨慎考虑。希望本文能够帮助你更好地理解C++的面向对象编程特性。

标签:函数,探索,继承,之美,C++,func,基类,public
From: https://blog.csdn.net/qq_50394172/article/details/143363388

相关文章

  • C++接口集成、身份实名认证-游戏防沉迷,保障未成年人健康
    随着互联网的快速发展,网络游戏在年轻人中越来越受欢迎。然而,未成年玩家长时间沉迷游戏的问题却引发了社会的广泛关注。为了应对这一现象,各大网络游戏平台纷纷引入翔云身份证实名认证接口,以有效辨别用户身份,建立完善的防沉迷系统,从而更好地保护未成年玩家的身心健康。......
  • 【C++】string 类深度解析:探秘字符串操作的核心
     快来参与讨论......
  • 国标GB28181软件LiteGBS国标GB28181-2016平台探索开启高清流畅直播新时代
    在当今信息化快速发展的时代,视频监控已成为公共安全、城市管理和企业安防等领域不可或缺的组成部分。然而,由于不同厂商生产的视频监控设备各自遵循不同的标准,导致设备之间无法互通,管理上也面临困难,这为安防系统的建设带来了显著挑战。为了解决这一问题,公安部提出了GB28181标准,即G......
  • 国标GB28181公网平台LiteGBS国标GB28181-2022平台应用场景探索
    在数字化时代迅猛发展的今天,视频监控技术已成为多个行业安全管理体系中的关键一环。国标GB28181公网平台LiteGBS以其出色的性能和多样化的应用范围,在提高公共服务水平和促进基层治理方式创新等方面扮演着至关重要的角色。本文将详细讨论LiteGBS在各个领域的应用情况,展示其强大的功......
  • 我接触csdn中的c++的时间
    大家好,我是AC使者,不知不觉我也来到CSDN半年了!在这半年我也看到了自身的不足,我也还有了很多粉丝,所以我今天来总结一下这半年的东西。第一篇--------结构体数组关于结构体数组的理解-CSDN博客第二篇--------字符串C05.L06.字符串合并_c++字符串合并-CSDN博客第三篇--------......
  • C++练习:股票买卖的最佳时机(1~4)
    121.买卖股票的最佳时机简介这是一道简单题,思路是找卖出那一天前的最低价格,然后记录卖出后的最大利润。按照动态规划的思路解题,我们需要找到原问题和子问题的转移关系。分析:n天内的最大利润,一定是1~n内某一天卖出股票的最大利润。我们知道要使我们手中的股票得到最大利润,就......
  • list(c++)
    list介绍list是STL容器中的容器,且元素在容器中的位置是分散的并与大小无关。list的底层是双向链表,其优势是在任意位置插入和删除元素的时间复杂度为O(1),但无法通过“下标[]”直接访问元素,需要通过从头(尾)遍历元素找到元素,多用于需要大量数据的插入和删除,且对数据的随机访问比......
  • 基于 C++ 的 UG/NX 二次开发环境配置
    基于C++的UG/NX二次开发环境配置参考教程:UG/NX二次开发环境配置方法(nx1980+vs2019)-CSDN博客NX二次开发VS环境搭建-怡宁塑胶模具设计-博客园(cnblogs.com)NX/UG二次开发环境配置方法—史上最详细版(以NX11.0和VisualStudio2017为例)_nx二次开发-CSDN博客在Windows......
  • 文件中台与安全:集成方案的探索与实践
    在企业数字化转型加速的今天,文件中台已成为支撑数据共享与高效协作的关键基础设施。然而,随着企业文件需求的增多和内容复杂性的提升,文件的安全问题也日益突显。如何在构建强大文件中台的同时,保障文件数据的安全性,已成为企业亟需解决的课题。文件中台的核心功能文件中台是企......
  • C++:日期类的实现
      目录一.日期类1.类的构造函数和拷贝构造2.日期的比较3.日期加减一个天数1.日期加天数2.日期减天数4.日期的++与--1.日期的++2.日期的--5.日期减日期6.日期的输入和输出二.整体代码1.Date.h2.Date.cpp      在前面几节的内容中,我们学习了类的基本......