📅  最后修改于: 2023-12-03 15:29:42.604000             🧑  作者: Mango
在面向对象编程中,继承是一种通过从现有类派生出新类而创建一个新类的机制。通过继承,新类可以获得现有类的属性和方法,从而不必重新编写这些代码。这可以节省时间和精力,并使代码更易于维护和扩展。
在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
类中的name
和age
属性以及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
基类,以及Rectangle
和Circle
两个派生类,这两个派生类都继承了Shape
基类,并且实现了getArea
方法,用于计算形状的面积。我们还定义了一个Color
类,它包含了color
属性,表示颜色。
我们还定义了一个ColoredRectangle
类,它是一个带颜色的矩形类,它继承了Rectangle
和Color
两个类。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
对象。Rectangle
和Circle
对象都只是简单的形状对象,而ColoredRectangle
对象是一个带颜色的矩形对象,它继承了Rectangle
和Color
两个类的属性和方法。