C++进阶知识系列文章
C++类的继承和派生
在面向对象编程中,继承是一种实现代码复用的方法。在C++中,类可以从另一个类继承属性和方法,被继承的类称为父类或基类,继承的类称为子类或派生类。通过继承,子类可以获得父类的所有公有成员,包括属性和方法,并且可以在此基础上添加自己的属性和方法。
基本语法
类的继承和派生的语法格式如下:
class ChildClass : public ParentClass{
// ChildClass 继承 ParentClass 的所有属性和方法
};
其中,ChildClass
是子类的名称,ParentClass
是父类的名称。public
是访问修饰符,表示子类可以访问父类的公有成员。C++支持多重继承,即一个子类可以继承多个父类。语法格式如下:
class ChildClass : public ParentClass1, public ParentClass2{
// ChildClass 继承 ParentClass1 和 ParentClass2 的所有属性和方法
};
访问修饰符
在C++中,访问修饰符public
、protected
和private
用于控制类的成员的访问权限。其中,public
成员可以被类的外部访问,protected
成员可以被类的子类访问,private
成员只能被类的内部访问。
构造函数和析构函数
子类的构造函数可以调用父类的构造函数来初始化父类的成员变量。调用父类构造函数的语法格式如下:
ChildClass::ChildClass(int a, int b, int c) : ParentClass(a, b){
// 初始化子类的成员变量
this->c = c;
}
其中,ChildClass
是子类的名称,ParentClass
是父类的名称,a
和b
是父类的成员变量,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;
}
以上代码定义了三个类 Shape
、Rectangle
和 Square
,Rectangle
和 Square
类继承了 Shape
类的属性和方法,并添加了自己的方法 getArea
。在 main
函数中,创建了 Rectangle
对象 Rect
和 Square
对象 Sq
,并调用了它们的方法 getArea
。