C++继承中同用途异类型变量处理及抽象基类实现问询
关于C++ SudokuGenerator基类的两个问题解答
1. 能否将successTask和failTask纳入基类?优化方案
直接把不同类型的successTask和failTask放到基类里不可行——C++没有虚变量,基类无法直接适配派生类的类型差异。但可以通过两种方案优化:
方案一:模板基类统一管理
将基类定义为模板类,把统计变量的类型作为模板参数,派生类根据自身需求指定类型,这样基类就能统一持有统计变量:
template<typename CountType> class SudokuGenerator { protected: CountType successTask = 0; CountType failTask = 0; public: virtual void generateAndInsert() = 0; }; // 派生类1:用int统计 class IntCountGenerator : public SudokuGenerator<int> { public: void generateAndInsert() override { // 业务逻辑中直接操作基类的统计变量 successTask++; } }; // 派生类2:用long long统计 class LongCountGenerator : public SudokuGenerator<long long> { public: void generateAndInsert() override { failTask++; } };
方案二:纯虚接口封装统计逻辑
基类不持有变量,而是定义纯虚的统计操作接口,让派生类自行实现变量存储和统计逻辑,基类只负责调用统一接口:
class SudokuGenerator { public: virtual void incrementSuccess() = 0; virtual void incrementFail() = 0; virtual void generateAndInsert() = 0; }; class DerivedGenerator : public SudokuGenerator { private: int successTask = 0; int failTask = 0; public: void incrementSuccess() override { successTask++; } void incrementFail() override { failTask++; } void generateAndInsert() override { // 业务逻辑中调用统计接口 incrementSuccess(); } };
2. 如何实现SudokuGenerator基类的不可实例化?
有两种可靠方法:
方法一:定义纯虚函数
在基类中声明至少一个纯虚函数(函数末尾加= 0),此时基类会变成抽象类,编译器会禁止直接实例化它:
class SudokuGenerator { public: // 纯虚函数,使基类成为抽象类 virtual void generateAndInsert() = 0; };
方法二:将构造函数设为protected
把基类的构造函数(包括默认、拷贝等)设为protected,这样外部代码无法直接调用构造函数创建对象,但派生类可以正常继承并调用构造函数:
class SudokuGenerator { protected: // 构造函数设为protected,外部无法实例化 SudokuGenerator() = default; SudokuGenerator(const SudokuGenerator&) = default; public: virtual void generateAndInsert() = 0; };
内容的提问来源于stack exchange,提问作者NOK
相关产品推荐
相关产品推荐

