1. C++中的多态性及其实现
多态性是面向对象编程的三大特性之一,它允许使用父类类型的指针或引用来指向子类对象,并通过这个父类类型的指针或引用来调用实际子类的成员函数。这样,就可以在运行时确定应该调用哪个具体的函数实现,从而实现一个接口多种形态。
多态性主要通过虚函数来实现。在基类中声明一个虚函数,然后在派生类中重写这个函数。当使用基类指针或引用来调用这个函数时,会根据实际指向的对象类型来调用相应的函数实现。
例如:
cpp复制代码
class Animal { | |
public: | |
virtual void speak() { // 虚函数 | |
std::cout << "The animal speaks" << std::endl; | |
} | |
}; | |
class Dog : public Animal { | |
public: | |
void speak() override { // 重写虚函数 | |
std::cout << "The dog barks" << std::endl; | |
} | |
}; | |
class Cat : public Animal { | |
public: | |
void speak() override { // 重写虚函数 | |
std::cout << "The cat meows" << std::endl; | |
} | |
}; | |
int main() { | |
Animal* animal1 = new Dog(); | |
Animal* animal2 = new Cat(); | |
animal1->speak(); // 输出 "The dog barks" | |
animal2->speak(); // 输出 "The cat meows" | |
delete animal1; | |
delete animal2; | |
return 0; | |
} |
在这个例子中,Animal
类有一个虚函数 speak()
,Dog
和 Cat
类都重写了这个函数。当通过 Animal
类型的指针调用 speak()
函数时,实际调用的是 Dog
或 Cat
类的 speak()
函数,这就是多态性的体现。
2. 智能指针及其类型
智能指针是C++11引入的一种特性,用于自动管理动态分配的内存,以避免内存泄漏。智能指针在对象离开作用域时会自动删除它所指向的对象,因此不需要显式调用 delete
。
C++中主要有以下几种智能指针:
std::unique_ptr
:独占所有权的智能指针,同一时间只能有一个unique_ptr
指向某个对象。当unique_ptr
被销毁(例如离开作用域)时,它所指向的对象也会被自动删除。std::shared_ptr
:共享所有权的智能指针,可以有多个shared_ptr
指向同一个对象。当最后一个指向某个对象的shared_ptr
被销毁时,该对象才会被删除。std::weak_ptr
:一种不控制所指向对象生存期的智能指针,它指向一个由shared_ptr
管理的对象。其目的是解决shared_ptr
相互引用导致的循环引用问题。
例如:
cpp复制代码
#include <memory> | |
#include <iostream> | |
class MyClass { | |
public: | |
~MyClass() { | |
std::cout << "Deleting MyClass" << std::endl; | |
} | |
}; | |
int main() { | |
// 使用 unique_ptr | |
std::unique_ptr<MyClass> ptr1(new MyClass()); | |
// 当 ptr1 离开作用域时,MyClass 对象将被自动删除 | |
// 使用 shared_ptr | |
std::shared_ptr<MyClass> ptr2(new MyClass()); | |
std::shared_ptr<MyClass> ptr3 = ptr2; // ptr2 和 ptr3 共享所有权 | |
// 当 ptr2 和 ptr3 都离开作用域时,MyClass 对象才会被删除 | |
// 使用 weak_ptr 解决循环引用问题(这里仅展示 weak_ptr 的基本用法) | |
std::shared_ptr<MyClass> ptr4(new MyClass()); | |
std::weak_ptr<MyClass> wptr = ptr4; | |
// wptr 不控制 MyClass 对象的生命周期,但它可以用来观察对象是否还存在 | |
return 0; | |
} |
3. 模板元编程及其在C++中的应用
模板元编程是C++的一种编程技术,利用模板在编译期进行计算和操作类型。它允许程序员在编译时创建和操作类型,从而实现一些高级功能,如类型特性检测、类型转换、生成代码等。模板元编程主要基于模板特化和递归模板展开。
模板元编程的一个典型应用是编写类型安全的容器或算法,它可以在不增加运行时开销的情况下提高代码的安全性和灵活性。
例如,我们可以使用模板元编程来实现一个简单的编译期阶乘函数:
cpp复制代码
template<int N> | |
struct Factorial { | |
enum { value = N * Factorial<N - 1>::value |