首页 > 编程语言 >C++中的继承

C++中的继承

时间:2024-11-08 22:58:00浏览次数:1  
标签:继承 基类 private protected C++ 派生类 public

在 C++ 中,继承的方式有三种:publicprotected 和 private。它们控制了基类成员在派生类中的访问权限。以下是这三种继承方式的区别:

1. public 继承

  • 基类的 public 成员在派生类中保持 public
  • 基类的 protected 成员在派生类中保持 protected
  • 基类的 private 成员在派生类中不可访问。

这种继承方式表示「is-a」的关系,派生类对象可以当作基类对象使用(比如赋值或传递给函数时可以转换为基类类型),适合用于多态性场景。

示例

struct Base {
    public:
        int publicVar;
    protected:
        int protectedVar;
    private:
        int privateVar;
};

struct Derived : public Base {
    void func() {
        publicVar = 1;     // 可访问
        protectedVar = 2;  // 可访问
        // privateVar = 3; // 不可访问,编译错误
    }
};

2. protected 继承

  • 基类的 public 和 protected 成员在派生类中都变为 protected
  • 基类的 private 成员在派生类中依然不可访问。

这种继承方式通常表示「implemented-in-terms-of」的关系,表示派生类需要使用基类的功能,但不希望外部直接把派生类当作基类使用。

示例

struct Derived : protected Base {
    void func() {
        publicVar = 1;     // 作为 protected 可访问
        protectedVar = 2;  // 可访问
    }
};
  • 在这种继承方式下,即使 publicVar 是基类中的 public 成员,在 Derived 中也只能作为 protected 访问,派生类的对象无法直接访问 publicVar

3. private 继承

  • 基类的 public 和 protected 成员在派生类中都变为 private
  • 基类的 private 成员在派生类中依然不可访问。

这种继承方式表示「is-implemented-in-terms-of」的关系,通常用于派生类仅作为内部实现细节,不希望基类的接口直接暴露在派生类接口中。

示例

struct Derived : private Base {
    void func() {
        publicVar = 1;     // 作为 private 可访问
        protectedVar = 2;  // 可访问
    }
};
  • 在这种继承方式下,基类的 public 和 protected 成员在派生类中都变成 private,外部无法通过派生类对象访问 Base 的 publicVar

总结

  • public 继承:派生类对象可以作为基类对象使用,适合多态。
  • protected 继承:限制外部直接使用基类接口,适合仅内部继承实现。
  • private 继承:更严格地封装了基类的接口,使其仅在派生类内部可用。

标签:继承,基类,private,protected,C++,派生类,public
From: https://www.cnblogs.com/chentiao/p/18536089

相关文章

  • C++中的std::shared_ptr
    std::shared_ptr 是C++11标准库中的智能指针类型,用于管理动态分配的对象。与传统指针不同,std::shared_ptr 自动管理内存,并在不再使用时自动释放对象,以避免内存泄漏。它是一种共享所有权的智能指针,即可以让多个 std::shared_ptr 指向同一个对象,并且会记录有多少个 std::shar......
  • C++中类型转换static_cast
    static_cast<type> 是C++中的一种类型转换方式,用于在编译期进行静态类型转换。与C风格的强制类型转换不同,static_cast 更加安全和明确,因为它只允许特定的类型转换,避免了潜在的错误和歧义。static_cast 的用法static_cast<type>(expression) 将 expression 转换为 typ......
  • c++--拷贝构造函数&友元函数
    目录1.拷贝构造函数是什么2.拷贝构造函数的基本格式2.1默认拷贝构造函数(浅拷贝)2.2深拷贝(DeepCopy)2.3浅拷贝(ShallowCopy)2.3浅拷贝和深拷贝总结2.友元函数1.拷贝构造函数是什么拷贝构造函数是一个特殊的构造函数,用于在创建新对象时,用已有对象的数据来初始......
  • 每日OJ题_牛客_BC157素数回文_数学_C++_Java
    目录牛客_BC157素数回文_数学题目解析C++代码Java代码牛客_BC157素数回文_数学素数回文_牛客题霸_牛客网描述:现在给出一个素数,这个素数满足两点:1、  只由1-9组成,并且每个数只出现一次,如13,23,1289。2、  位数从高到低为递减或递增,如2459,87631。请你判断一下,这......
  • C++之setw
    1.什么是setwsetw是C++中一个用于控制输出宽度的操纵符(manipulator),它定义在<iomanip>头文件中。通过setw可以指定下一个输出项应占用的字符宽度,在格式化输出时非常有用。2.setw的作用setw(n)设置的宽度n表示下一个要输出的项所占的最小宽度。如果输出项的实际字......
  • C++之endl以及它与换行符的区别
    看下C++_primer上的一段话,并给予解释:1.endl是操纵符在C++中,endl是一种特殊的操纵符(manipulator),它的作用不仅是结束一行(相当于换行),还会刷新缓冲区。操纵符是一种可以影响输出行为的特殊值,比如endl、setw等。题外话想要了解更多关于setw的内容,可以看下这篇博客C++之set......
  • C++中类和结构体的互相继承
    在C++中,struct可以继承类,反之,类也可以继承struct。struct和类的唯一区别在于访问级别,默认情况下,struct的成员是public,而类的成员是private。以下是一个简单的例子:classBaseClass{public:voidBaseFunction(){std::cout<<"FunctioninBaseClass"<<std::endl;......
  • C++之fixed
    在C++中,fixed是一个操纵符(manipulator),用于指定浮点数的显示格式。在默认情况下,C++会使用科学计数法或定点(小数点)格式输出浮点数,具体取决于数值的大小和有效位数。然而,当使用fixed时,它会强制所有浮点数都以定点格式显示,即以小数点后的固定位数输出,不使用科学计数法。fixed......
  • C++模板真的没有教材讲的呢么简单
            模板和泛型编程息息相关,但是大多数人对模板的了解可能只是教材上的一个compare函数,但实际上模板的内容很丰富,学起来也比较抽象,我会结合我所了解的一部分模板内容进行解释。    本文内容参考《C++Primer》目录定义模板模板实参推演可变参数模板......
  • C++——求a!+b!+c!的值,用一个函数fac(n)求n!。a,b,c的值由主函数输入,最终得到的值在主
    没注释的源代码#include<iostream>usingnamespacestd;intfun(intn);intmain(){   inta,b,c,sum;   cout<<"pleaseinputa,b,c:";   cin>>a>>b>>c;   sum=fun(a)+fun(b)+fun(c);   cout<<"a!+b!+c!="......