C++进阶知识系列文章

C++类的继承和派生

在面向对象编程中,继承是一种实现代码复用的方法。在C++中,类可以从另一个类继承属性和方法,被继承的类称为父类或基类,继承的类称为子类或派生类。通过继承,子类可以获得父类的所有公有成员,包括属性和方法,并且可以在此基础上添加自己的属性和方法。

基本语法

类的继承和派生的语法格式如下:

class ChildClass : public ParentClass{
    // ChildClass 继承 ParentClass 的所有属性和方法
};

其中,ChildClass是子类的名称,ParentClass是父类的名称。public是访问修饰符,表示子类可以访问父类的公有成员。C++支持多重继承,即一个子类可以继承多个父类。语法格式如下:

class ChildClass : public ParentClass1, public ParentClass2{
    // ChildClass 继承 ParentClass1 和 ParentClass2 的所有属性和方法
};

访问修饰符

在C++中,访问修饰符publicprotectedprivate用于控制类的成员的访问权限。其中,public成员可以被类的外部访问,protected成员可以被类的子类访问,private成员只能被类的内部访问。

构造函数和析构函数

子类的构造函数可以调用父类的构造函数来初始化父类的成员变量。调用父类构造函数的语法格式如下:

ChildClass::ChildClass(int a, int b, int c) : ParentClass(a, b){
    // 初始化子类的成员变量
    this->c = c;
}

其中,ChildClass是子类的名称,ParentClass是父类的名称,ab是父类的成员变量,c是子类的成员变量。如果子类没有显式调用父类的构造函数,编译器会自动调用父类的默认构造函数。

子类的析构函数也可以调用父类的析构函数来释放父类的资源,语法格式如下:

ChildClass::~ChildClass(){
    // 释放子类的资源
}

覆盖父类的方法

在子类中,可以覆盖父类的方法,以实现自己的功能。覆盖父类的方法的语法格式如下:

void ChildClass::print(){
    // 子类自己的实现
}

其中,ChildClass是子类的名称,print是覆盖的方法名。如果子类没有覆盖父类的方法,子类会继承父类的方法。

虚函数和纯虚函数

在C++中,虚函数是一种特殊的成员函数,它可以被子类覆盖。在父类中声明一个虚函数,可以使子类在覆盖该函数时保持相同的函数签名。语法格式如下:

class ParentClass{
public:
    virtual void print(){
        cout << "This is ParentClass" << endl;
    }
};

在子类中覆盖父类的虚函数,可以使用override关键字显式声明。语法格式如下:

class ChildClass : public ParentClass{
public:
    void print() override{
        cout << "This is ChildClass" << endl;
    }
};

纯虚函数是一种没有实现的虚函数,它在父类中声明,但是没有函数体。纯虚函数可以用来实现接口,即父类只声明接口,子类负责实现接口。语法格式如下:

class ParentClass{
public:
    virtual void print() = 0;
};

示例代码

#include <iostream>
using namespace std;

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);
    }
};

class Square: public Shape{
public:
    int getArea(){
        return (width * width);
    }
};

int main(){
    Rectangle Rect;
    Rect.setWidth(5);
    Rect.setHeight(7);
    cout << "Rect Area: " << Rect.getArea() << endl;
    Square Sq;
    Sq.setWidth(5);
    cout << "Sq Area: " << Sq.getArea() << endl;
    return 0;
}

以上代码定义了三个类 ShapeRectangleSquareRectangleSquare 类继承了 Shape 类的属性和方法,并添加了自己的方法 getArea。在 main 函数中,创建了 Rectangle 对象 RectSquare 对象 Sq,并调用了它们的方法 getArea

参考资料

04-29 08:23