在C++中,继承是一种面向对象编程的核心概念,它是一种机制,允许一个类(称为子类或派生类)从另一个类(称为父类或基类)中继承属性和行为,子类派生类可以重用父类或基类的代码,并且可以添加新的功能或修改现有功能。继承通过创建类之间的层次结构来组织和重用代码。
C++中的继承使用关键字class
后跟一个冒号:
,然后是要继承的类的名称。格式如下:
class BaseClass {
public:
// Base class members and methods
};
class DerivedClass : public BaseClass {
public:
// Derived class members and methods
};
在继承中,子类会继承父类的成员(字段和方法),这些成员在子类中可以直接使用,就好像它们是子类自己的一样。子类可以通过扩展或修改继承来自父类的成员,或者添加新的成员和方法。这使得在应用中可以轻松地建立层次化的类结构。
-
基类(Base Class):也称为父类或超类,是继承关系中位于上层的类。基类定义了一个或多个子类(派生类)所共有的属性和方法。基类的对象通常是更抽象或更泛化的概念,而不是具体的实例。
-
派生类(Derived Class):也称为子类或继承类,是继承关系中位于下层的类。派生类通过继承基类的属性和方法来扩展或特化基类的功能。它可以添加新的属性和方法,也可以重写基类的方法。
接着,让我们通过一个简单的动物类例子来演示继承。
//父类
class Animal
{
public:
Animal(){
std::cout << "Animal 构造函数" << std::endl;
}
~Animal(){
std::cout << "Animal 析构函数" << std::endl;
}
int m_nAge;
void eat(){
std::cout << "Eat 函数" << std::endl;
}
void run();
};
//子类
class Cat : public Animal
{
public:
Cat(){
std::cout << "Cat 构造函数" << std::endl;
}
~Cat(){
std::cout << "Cat 析构函数" << std::endl;
}
char * szName = nullptr;
private:
};
这段代码是一个简单的 C++ 类的示例,其中有一个父类 Animal
和一个子类 Cat
。
父类 Animal
:
-
Animal
类有一个默认构造函数Animal()
和默认析构函数~Animal()
。 -
它有一个公有的整型成员变量
m_nAge
,表示动物的年龄。 -
eat()
和run()
是公有成员函数,表示动物的吃和跑的行为。
子类 Cat
:
-
Cat
类继承自Animal
,使用: public Animal
指定了继承关系。 -
它有一个默认构造函数
Cat()
和默认析构函数~Cat()
。 -
它有一个私有成员变量
szName
,表示猫的名字。这个变量是一个指向字符的指针,并被初始化为nullptr
,即空指针。
这种继承方式使得 Cat
类具有 Animal
类的所有行为和属性,并且可以根据需要添加自己的特定行为和属性。
这个时候我们在主程序中new
一个Cat
类的对象,执行任意成员方法,接着销毁该对象的地址空间查看结果:
int main() {
Cat * catObjA = new Cat;
catObjA->eat();//执行成员
delete catObjA;
system("pause");
return 0;
}
由该结果可得到,子类在进行构造析构的时候不仅会调用自身的构造、析构函数还会隐式调用父类的构造和析构函数,且子类也拥有父类中的公共成员
。
如果这个时候我将父类中的成员方法eat
转变为私有成员或者保护成员那么这个时候子类对象就无法进行直接地调用了;
class Animal
{
public:
Animal();
~Animal();
int m_nAge;
void run();
private:
void eat();
private:
};
此时程序直接爆红:
这就涉及到C++的三种权限继承。这三种权限我们留着下篇文章再来分析。