C++ 中的继承与派生
在 C++ 中,继承与派生是面向对象编程的重要特性,它们允许创建新类(派生类)来复用现有类(基类)的属性和方法,同时还能添加新的功能或修改现有功能,下面为你详细介绍。
基本概念
- 继承:是指一个新类(派生类)可以从一个或多个已有类(基类)中获取其属性和方法的机制。通过继承,派生类可以复用基类的代码,提高代码的可重用性和可维护性。
- 派生:是指从一个已有的类创建新类的过程。派生类除了拥有基类的成员外,还可以添加自己的成员,从而扩展基类的功能。
语法
定义派生类的一般语法如下:
class 派生类名 : 继承方式 基类名 {
// 派生类的成员声明
};
- 派生类名:新创建的类的名称。
- 继承方式:指定派生类如何继承基类的成员,有三种继承方式:
public
(公有继承)、protected
(保护继承)和private
(私有继承)。 - 基类名:已有的类的名称。
继承方式
1. 公有继承(public
)
- 基类的公有成员在派生类中仍然是公有的。
- 基类的保护成员在派生类中仍然是保护的。
- 基类的私有成员在派生类中不可直接访问。
#include <iostream>
// 基类
class Base {
public:
void publicFunc() {
std::cout << "Base public function" << std::endl;
}
protected:
void protectedFunc() {
std::cout << "Base protected function" << std::endl;
}
private:
void privateFunc() {
std::cout << "Base private function" << std::endl;
}
};
// 派生类,公有继承
class Derived : public Base {
public:
void test() {
publicFunc(); // 可以访问
protectedFunc(); // 可以访问
// privateFunc(); // 不能访问
}
};
int main() {
Derived d;
d.publicFunc(); // 可以访问
// d.protectedFunc(); // 不能在类外访问
d.test();
return 0;
}
2. 保护继承(protected
)
- 基类的公有成员和保护成员在派生类中都变为保护的。
- 基类的私有成员在派生类中不可直接访问。
3. 私有继承(private
)
- 基类的公有成员和保护成员在派生类中都变为私有的。
- 基类的私有成员在派生类中不可直接访问。
派生类的构造函数和析构函数
- 构造函数:派生类的构造函数在创建对象时会先调用基类的构造函数,然后再执行自身的构造函数体。如果基类有带参数的构造函数,派生类需要在其构造函数的初始化列表中显式调用基类的构造函数。
- 析构函数:派生类的析构函数在对象销毁时会先执行自身的析构函数体,然后再调用基类的析构函数。
#include <iostream>
// 基类
class Base {
public:
Base() {
std::cout << "Base constructor" << std::endl;
}
~Base() {
std::cout << "Base destructor" << std::endl;
}
};
// 派生类
class Derived : public Base {
public:
Derived() {
std::cout << "Derived constructor" << std::endl;
}
~Derived() {
std::cout << "Derived destructor" << std::endl;
}
};
int main() {
Derived d;
return 0;
}
派生类对基类成员的访问和覆盖
- 访问:派生类可以直接访问基类的公有和保护成员,但不能直接访问基类的私有成员。
- 覆盖:派生类可以定义与基类同名的成员函数,从而覆盖基类的成员函数。当通过派生类对象调用该函数时,将调用派生类中定义的函数。
#include <iostream>
// 基类
class Base {
public:
void func() {
std::cout << "Base func" << std::endl;
}
};
// 派生类
class Derived : public Base {
public:
void func() {
std::cout << "Derived func" << std::endl;
}
};
int main() {
Derived d;
d.func(); // 调用派生类的 func 函数
d.Base::func(); // 调用基类的 func 函数
return 0;
}
多重继承
C++ 支持多重继承,即一个派生类可以从多个基类继承属性和方法。多重继承的语法如下:
class 派生类名 : 继承方式 基类名1, 继承方式 基类名2, ... {
// 派生类的成员声明
};
多重继承虽然可以增加代码的复用性,但也会带来一些问题,如命名冲突和菱形继承问题,需要使用作用域解析运算符或虚拟继承来解决。