C++精品小案例:C++中的多态性及其实现、模板元编程及其在C++中的应用

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
  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值