📜  C ++ |继承|问题1(1)

📅  最后修改于: 2023-12-03 15:29:42.604000             🧑  作者: Mango

C++ | 继承 | 问题1

简介

在面向对象编程中,继承是一种通过从现有类派生出新类而创建一个新类的机制。通过继承,新类可以获得现有类的属性和方法,从而不必重新编写这些代码。这可以节省时间和精力,并使代码更易于维护和扩展。

在C++中,继承包括单继承和多继承两种形式。单继承指的是一个类可以从另一个类继承一组属性和方法,而多继承则是一个类可以从多个类继承属性和方法。

单继承
定义基类和派生类

在C++中,通过使用关键字class定义类,可以定义一个基类。基类是一个通用类,它定义了一组属性和方法。

//定义一个Person类
class Person {
public:
    string name;
    int age;
    void sayName() {
        cout << "My name is " << name << endl;
    }
};

在上面的代码中,我们定义了一个Person类,它有一个name属性和一个age属性,以及一个sayName方法,用于打印人物的名字。

我们可以通过在派生类的类名后添加一个冒号和关键字public来定义一个派生类。派生类继承了基类的所有成员变量和方法。在派生类中,我们可以添加新的成员变量和方法,也可以重写基类的方法。

//定义一个Student类,它继承了Person类
class Student : public Person {
public:
    string school;
    void saySchool() {
        cout << "My school is " << school << endl;
    }
};

在上面的代码中,我们定义了一个Student类,它继承了Person类,并添加了一个school属性和一个saySchool方法。Student类还默认拥有Person类中的nameage属性以及sayName方法。

创建对象

当我们定义了一个派生类后,我们可以创建派生类的对象。创建对象时,我们可以使用基类中定义的属性和方法,也可以使用派生类中定义的属性和方法。

//创建一个Person对象
Person person;
person.name = "Tom";
person.age = 20;
person.sayName();   //输出"My name is Tom"

//创建一个Student对象
Student student;
student.name = "Jack";
student.age = 18;
student.school = "ABC University";
student.sayName();      //输出"My name is Jack"
student.saySchool();    //输出"My school is ABC University"

在上面的代码中,我们创建了一个Person对象和一个Student对象。Person对象只能使用Person类中的属性和方法,而Student对象继承了Person类的属性和方法,并添加了它自己的属性和方法。

多继承

在C++中,多继承指的是一个类可以从多个类继承属性和方法。多重继承是一种强大的面向对象编程技术,使得程序员可以创建更复杂的类层次结构。C++的多重继承已经存在了很长时间,并且被许多高级框架用于创建复杂的层次结构。

定义基类和派生类

在多继承中,我们可以创建一个派生类,并从多个基类继承属性和方法。

//定义一个Shape基类
class Shape {
public:
    virtual double getArea() const = 0; //纯虚函数
};

//定义一个Rectangle基类
class Rectangle : public Shape {
public:
    Rectangle(double w, double h)
        : width(w), height(h)
    {}
    virtual double getArea() const {
        return width * height;
    }
protected:
    double width;
    double height;
};

//定义一个Circle基类
class Circle : public Shape {
public:
    Circle(double r)
        : radius(r)
    {}
    virtual double getArea() const {
        return M_PI * radius * radius;
    }
protected:
    double radius;
};

//定义一个颜色类
class Color {
public:
    Color(const string& c)
        : color(c)
    {}
protected:
    string color;
};

//定义一个带颜色的矩形类
class ColoredRectangle : public Rectangle, public Color {
public:
    ColoredRectangle(double w, double h, const string& c)
        : Rectangle(w, h), Color(c)
    {}
    void printColor() const {
        cout << "Color is " << color << endl;
    }
};

在上面的代码中,我们定义了一个Shape基类,以及RectangleCircle两个派生类,这两个派生类都继承了Shape基类,并且实现了getArea方法,用于计算形状的面积。我们还定义了一个Color类,它包含了color属性,表示颜色。

我们还定义了一个ColoredRectangle类,它是一个带颜色的矩形类,它继承了RectangleColor两个类。ColoredRectangle类还添加了一个printColor方法,用于输出矩形的颜色。

创建对象

当我们定义了一个多重继承的派生类后,我们可以创建派生类的对象。

//创建一个Rectangle对象
Rectangle rectangle1(2.0, 3.0);
cout << "Rectangle1 area is " << rectangle1.getArea() << endl;  //输出"Rectangle1 area is 6"

//创建一个Circle对象
Circle circle1(1.0);
cout << "Circle1 area is " << circle1.getArea() << endl;  //输出"Circle1 area is 3.14159"

//创建一个ColoredRectangle对象
ColoredRectangle coloredRectangle1(2.0, 3.0, "red");
cout << "ColoredRectangle1 area is " << coloredRectangle1.getArea() << endl;  //输出"ColoredRectangle1 area is 6"
coloredRectangle1.printColor();    //输出"Color is red"

在上面的代码中,我们创建了一个Rectangle对象、一个Circle对象以及一个ColoredRectangle对象。RectangleCircle对象都只是简单的形状对象,而ColoredRectangle对象是一个带颜色的矩形对象,它继承了RectangleColor两个类的属性和方法。