【c++基础概念理解——为什么要用抽象类指针作为成员变量】

概要

这两天工作中,看到一段代码实现是用抽象类的指针作为成员变量。然后通过上层传入具体实现类的指针赋值。那么我们为什么要用抽象类指针作为成员变量呢?

代码

class Manager {
public:
    std::unique_ptr<IManagerFactory> ManagerFactory;

    Manager(std::unique_ptr<IManagerFactory> factory)
        : ManagerFactory(std::move(factory)) {}

    void createTask() {
        auto task = ManagerFactory->create();
        // 使用 task
    }
};

提示:这里std::unique_ptr<IManagerFactory> ManagerFactory; 就是用抽象类指针定义的成员变量

解释

C++中,不能直接实例化抽象类(虚类),但可以使用指向抽象类的指针或引用来定义成员变量。这是因为指针和引用只存储对象的地址,而不需要知道对象的具体类型。

将成员变量定义为抽象类(虚类)的指针或引用,而不是具体类的实例,是为了实现面向对象编程中的多态性和依赖倒置原则。这样做有以下几个好处:

    1. 多态性
      通过使用抽象类的指针或引用,你可以在运行时决定使用哪个具体实现类。这使得代码更加灵活和可扩展。
    1. 依赖倒置原则
      依赖倒置原则(Dependency Inversion Principle, DIP)是SOLID原则之一。它建议高层模块不应该依赖于低层模块,而是都应该依赖于抽象。通过依赖抽象类而不是具体类,可以减少模块之间的耦合,提高代码的可维护性和可测试性。
    1. 测试友好
      使用抽象类作为成员变量,可以在单元测试中轻松地使用模拟对象(mock objects)来替代实际的实现类,从而进行隔离测试。

小结

通过这种方式,你可以在不修改 Manager 类的情况下,轻松地替换 IManagerFactory 的具体实现,从而提高代码的灵活性和可扩展性。

1. 请创建一个抽象类DataStructure,该类包括下面的成员变量和成员函数: 1) 一个成员变量len,表示里面的元素个数最大值 2) 构造函数DataStructure(int l),将len初始化为0 3) 虚析构函数~DataStructure() 4) 纯虚函数Output(),输出DataStructure中的数据 5) 纯虚函数Size(),返回DataStructure中的元素个数 2. 请创建DataStructure的一个派生类MyString,该类包括下面的成员变量和成员函数: 1) 一个成员变量char* data,表示里面的数据 2) 构造函数MyString(int max_size),将MyString初始化为空串,最大元素个数为max_size 3) 析构函数~MyString(),释放相应的数据 4) Input()函数,往MyString输入数据 5) 重载operator+=()函数,实现两个字符串的连接 6) 重定义Output()和Size()函数 3. 请创建DataStructure的一个派生类MyStack,该类包括下面的成员变量和成员函数: 1) 一个成员变量int* data,用于里面的数据 2) 一个成员变量int top,表示最上面的元素下标 3) 构造函数MyStack(int max_size),将MyStack初始化为空栈,最大元素个数为max_size 4) 析构函数~MyStack(),释放相应的数据 5) Push_back(int e)函数,往栈里面压入一个数据e 6) 重定义Output()和Size()函数 4. 请编写main函数,测试上面程序的正确性 1) 创建两个MyString的对象str1和str2,分别调用Input函数输入str1和str2,然后分别调用operator+=函数将str2连接到str1的末尾 2) 创建一个MyStack的对象stack,调用Push_back函数输入往stack中输入m(m < max_size)个数据 3) 创建一个长度为3的DataStructure*类型的数组,将其3个元素分别指向str1, str2, stack,然后编写for循环调用Size()和Output()函数输出每个元素的大小和内容。 5. 输入输出样例: 1) 输入样例 A promising techni que for checking reachability 4 12 23 34 45 2) 输出样例 47 A promising technique for checking reachability 29 que for checking reachability 4 12 23 34 45
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值