C++核心特性:继承派生、虚函数与模板深度解析
C++多态与泛型编程是构建高效软件的基础。本文系统梳理继承与派生的关系及其访问控制,讲解如何利用虚函数实现动态绑定以解决同名函数遮蔽问题,并分析模板在提高代码复用性方面的实践应用。
继承与派生
继承(Inheritance)指一个类获取另一个类的成员变量和函数,被继承的称为父类或基类,继承的称为子类或派生类。两者视角不同,实质相同。C++支持多继承,使用 : 符号连接基类。
第1步:定义继承与访问修饰符
派生声明语法为 class 派生类名: [继承方式] 基类名 { ... }。默认继承方式为私有(private)。不同的继承方式决定了外部对象对基类成员的访问权限:
- public 派生:基类公有成员保持公有,保护成员保持保护。
class Child : public Parent { ... }; - protected 派生:基类公有和保护成员均变为派生类的保护成员。
class Child : protected Parent { ... }; - private 派生:基类公有和保护成员均变为派生类的私有成员。
class Child : private Parent { ... };
对于外部调用者:
- Public 继承下,可访问派生类暴露的基类公有成员。
- Private/Protected 继承下,外部无法通过派生类对象访问基类的公有属性。
虚函数与多态
若基类与派生类拥有同名函数,无论参数是否相同,派生类都会遮蔽基类的所有同名函数,而非构成重载。默认情况下,指针或引用指向基类时,调用的是基类的版本。
第2步:利用虚函数实现动态绑定
为了实现“子类对象赋值给基类指针时调用子类方法”,需将基类对应函数声明为 virtual。关键原则如下:
- 纯虚函数与抽象类:形如
virtual void func() = 0;的函数无函数体。包含纯虚函数的类为抽象类,不可实例化,必须由派生类实现后创建对象。 - 虚析构函数:基类析构函数必须声明为虚函数。否则通过基类指针删除派生类对象时,仅触发基类析构,导致内存泄漏。
- override 关键字:用于显式标识派生类覆盖虚函数,增强代码安全性。
#include <iostream>
using namespace std;
class Person {
public:
virtual void look() { cout << "virtual look" << endl; }
virtual ~Person() { cout << "~Person" << endl; }
};
class Child : public Person {
public:
void look() override {
cout << "child look" << endl;
Person::look();
}
~Child() { cout << "~Child" << endl; }
};
int main() {
Person* p = new Child();
p->look(); // 输出 child look 和 virtual look
delete p; // 安全释放
}
内存结构上,含有虚函数的类包含虚函数表指针 vtable(通常占8字节),存放实际执行方法的地址。
模板技术
模板允许定义通用的函数或类,编译器在编译时进行实例化。因此,**声明(.h)与实现(.cpp)不能分离**,所有定义必须在头文件中,否则链接器找不到实例。
第3步:构建通用数据结构
类模板中,内部操作无需像 Java 一样限制泛型边界,直接调用类型提供的接口即可(但可能引发编译错误)。
// 泛型数组模拟
template<typename T>
class ArrayList {
int size, realSize{};
T* arr;
public:
void add(T val) { /* 扩容与追加逻辑 */ }
T get(int index) { /* 读取逻辑 */ }
};
第4步:处理字符串转换
C++ string 对象位于堆区,可直接增删改。若需与 C 标准库交互,应使用 c_str() 获取常量指针,并通过 strcpy 复制到缓冲区,防止对象析构后悬垂。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













