c++继承

Posted 牛郎恋刘娘,刘娘念牛郎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++继承相关的知识,希望对你有一定的参考价值。

c++继承

c++继承

C++ 继承是一种面向对象编程的重要特性,它允许我们创建一个新的类,从现有的类中继承属性和方法,并且可以添加新的属性和方法。

在 C++ 中,继承是通过关键字 class 或 struct 后面跟着一个冒号和基类名称来实现的,基类可以是任何已存在的类,派生类继承了基类的所有公有和受保护的成员,但不继承基类的私有成员。

下面是一个简单的 C++ 继承的例子:

// 基类
class Shape 
public:
    void setWidth(int w) 
        width = w;
    
    void setHeight(int h) 
        height = h;
    
protected:
    int width;
    int height;
;

// 派生类
class Rectangle: public Shape 
public:
    int getArea() 
        return (width * height);
    
;

int main() 
    Rectangle rect;
    rect.setWidth(5);
    rect.setHeight(10);
    int area = rect.getArea();
    cout << "Area: " << area << endl;
    return 0;

在上面的例子中,我们定义了一个基类 Shape,它有两个成员变量 width 和 height,以及两个成员函数 setWidth 和 setHeight。然后我们定义了一个派生类 Rectangle,它从基类 Shape 继承了 width 和 height,并且定义了一个成员函数 getArea,用于计算矩形的面积。

在主函数中,我们创建了一个 Rectangle 对象 rect,并设置其宽度和高度,最后调用 getArea 函数计算矩形的面积并输出。

需要注意的是,派生类只能访问基类的公有和受保护成员,不能访问基类的私有成员。同时,派生类可以覆盖基类的成员函数,也可以添加新的成员函数和成员变量,以满足自己的需求。

Public

那么 继承的时候 用pulic的意义在哪?

在 C++ 中,继承使用 public 访问修饰符的原因是为了实现代码的重用和多态性。

通过 public 继承,子类可以继承基类的公有成员和受保护成员,这样可以避免在子类中重新编写基类的代码,实现了代码的重用。

同时,通过 public 继承,子类可以对基类的成员函数进行覆盖,从而实现多态性。多态性是面向对象编程的一个重要特性,它可以使代码更加灵活和可扩展。如果使用 private 或 protected 继承,子类无法访问基类的公有成员,也无法对基类的成员函数进行覆盖,这就限制了代码的重用和多态性。

另外,需要注意的是,使用 public 继承时,子类可以访问基类的公有成员和受保护成员,但是不能直接访问基类的私有成员。如果需要访问基类的私有成员,可以通过基类的公有成员函数或受保护成员函数来实现。

C++的多重继承

C++允许多重继承,多重继承是C++与其他一些流行语言不同的一个地方。比如在JAVA中就不存在多重继承,为此,当涉及到类似C++多重继承的场景时,JAVA之类的语言都使用“接口”的形式来实现目的,在C++里是没有接口的概念的,对应需求的使用对虚基类的多重继承来实现。下面就整理一下多重继承的基本用法和几个注意事项。
 
  • 基类
class Base
{
public:
    int baseInt;
};
  • 继承自基类的两个并列的类
clase Left : public Base
{
    Left() : Base()    //注意要继承基类构造函数
    {
    }
};
clase Right : public Base
{
    Right() : Base()    //注意要继承基类构造函数
    {
    }
};
  • 多重继承上面两个类
clase Multi : public Left, public Right
{
    Multi() : Base(), Left(), Right()    //继承所有基类构造函数
    {
    }
};

 

【注意】
上述多重继承方法的逻辑结构如下:
技术分享
技术分享
技术分享
Multi中会有重复的Base成员baseInt,当使用到该变量的时候会产生歧义而不通过编译
 
解决方法:
Left和Right继承Base时,使用virtual继承(这个virtual和虚函数无任何关系),类似下面这样:
 
clase Left : virtual public Base
 
【注意】
当使用Left* left指向一个Multi对象时,如果想使用从Right继承过来的变量或函数,我们会需要将这个Left类型的指针转换成一个Right型的指针,此时:
Right* right = (Right*)left;    //错误
Right* right = dynamic_cast<Right*>(left);    //正确,此时由于Left与Right在继承机构中是平级关系,该转换也成为交叉转换
 
原因:
由于继承过来的各种virtual函数,Multi对象中会对应每个直接继承的基类都维护一个vtable(这个部分请搜索这几个关键字去了解:virtual函数、动态绑定、运行时多态),按照继承的循序排列,vtable中保存从对应基类继承过来的函数的地址;直接强制转换会导致查错vtable

以上是关于c++继承的主要内容,如果未能解决你的问题,请参考以下文章

谁知道c++的好处?

C语言和C++有啥区别?

Visual C++和C++的区别

什么是c加加啊

objective-c和c++的区别

适合具备 C 语言基础的 C++ 教程