当前位置: 首页 > news >正文

东莞设计网站企业淘宝客建站需要多少钱

东莞设计网站企业,淘宝客建站需要多少钱,做网站需要的程序,桥头东莞网站建设Effective C 条款39:明智而审慎地使用private继承核心思想:private继承是一种实现技术而非接口继承,它意味着"根据某物实现出"。与public继承不同,private继承不会建立is-a关系,而是实现细节的复用机制。优先…

Effective C++ 条款39:明智而审慎地使用private继承


核心思想private继承是一种实现技术而非接口继承,它意味着"根据某物实现出"。与public继承不同,private继承不会建立is-a关系,而是实现细节的复用机制。优先选择组合(composition),仅在需要访问protected成员、重写虚函数或进行空基类优化时使用private继承。

⚠️ 1. private继承的特性与实现

特性对照

特性public继承private继承
接口继承
类型转换派生类可转基类(向上转型)仅在派生类内部可转换
基类成员访问保持原访问权限所有基类成员变为private
设计意义is-a关系implemented-in-terms-of

代码实现模式

// private继承示例
class Timer {
public:explicit Timer(int tickFreq);virtual void onTick() const; // 虚函数
};// 私有继承:Widget根据Timer实现
class Widget : private Timer {
private:virtual void onTick() const override; // 重写虚函数
};// 组合实现相同功能
class Widget {
private:class WidgetTimer : public Timer {virtual void onTick() const override;};WidgetTimer timer_;
};

🚨 2. private继承 vs 组合的决策指南

决策矩阵

场景推荐方案原因注意点
复用实现且无需多态✅ 组合更低的耦合,更好的封装优先选择
复用实现且需要重写虚函数🔶 private继承必须继承才能重写基类必须有虚函数
访问基类protected成员🔶 private继承组合无法访问protected成员考虑基类设计是否合理
空基类优化(EBO)✅ private继承节省内存仅对空基类有效
实现多态但不暴露接口🔶 private继承+重写隐藏基类接口确保基类析构函数非虚

错误使用案例

// 错误:用public继承代替private
class Stack : public std::vector<int> {
public:void push(int value) { push_back(value); }int pop() { int top = back(); pop_back(); return top;}
};// 客户端误用
Stack s;
s.push(42);
s.erase(s.begin()); // 破坏栈的封装性!

组合替代方案

class SafeStack {
public:void push(int value) { impl_.push_back(value); }int pop() {if (impl_.empty()) throw EmptyStack();int top = impl_.back();impl_.pop_back();return top;}
private:std::vector<int> impl_; // 组合实现
};// 安全使用
SafeStack s;
s.push(42);
// s.erase(...); // 编译错误:接口被封装

⚖️ 3. 最佳实践与适用场景

场景1:空基类优化(EBO)

class EmptyAllocator { /* 无成员变量 */ };// 组合:占用额外空间
class ContainerA {int data;EmptyAllocator alloc; // 通常占1字节
}; // sizeof ≥ 8(int+填充)// private继承:触发EBO
class ContainerB : private EmptyAllocator {int data;
}; // sizeof = 4(编译器优化)

场景2:访问protected成员

class BaseWithProtected {
protected:virtual void setup() = 0; // 派生类必须实现
};// 必须继承才能访问protected成员
class CustomImpl : private BaseWithProtected {
private:void setup() override { /* 定制实现 */ }
};

现代C++增强

// C++11 final和override
class Observer : private Observable {
private:virtual void update() override final; // 明确重写并禁止进一步重写
};// C++20 concepts约束
template<typename T>
class SortedCollection : private std::vector<T> {static_assert(std::is_arithmetic_v<T>, "Numeric types only");
};

💡 关键设计原则

  1. 优先选择组合

    // 除非必要,否则用组合替代private继承
    class Widget {
    private:Timer timer_; // 组合而非继承
    public:void trigger() { timer_.onTick(); }
    };
    
  2. 警惕名称隐藏

    class Base {
    public:void log() const;
    };class Derived : private Base {
    public:using Base::log; // 显式暴露基类方法
    };
    
  3. 防止多态误用

    class Base {
    public:virtual ~Base() = default; // 基类有虚析构函数
    };class Derived : private Base { /*...*/ };// 编译错误:private继承阻止向上转型
    // Base* pb = new Derived; 
    

空基类优化实战

template<typename T, typename Alloc = std::allocator<T>>
class CustomVector : private Alloc { // EBO优化
private:T* data_;size_t size_, capacity_;
public:// 继承分配器方法using Alloc::allocate;using Alloc::deallocate;
};// 验证:sizeof(CustomVector<int>) == 3*sizeof(void*)

多态实现隐藏

class DatabaseInterface {
protected:virtual Result query(const std::string&) = 0;
};class SecureDatabase : private DatabaseInterface {
private:Result query(const std::string& sql) override {validate(sql); // 安全检查return realQuery(sql);}
};// 对外暴露安全接口
class DatabaseClient {
public:Result safeQuery(const std::string& sql) {return db_.query(sql); // 调用私有继承实现}
private:SecureDatabase db_;
};

总结:private继承是C++中一种特殊的工具,应当谨慎使用。在大多数情况下,组合是更好的选择。private继承适用于需要重写基类虚函数、访问基类protected成员或进行空基类优化的情况。设计时应明确区分接口继承和实现继承,避免误用。

http://www.dtcms.com/a/588958.html

相关文章:

  • ROS2 Humble 笔记(十二)launch 文件与 namespace 启动多个节点
  • nginx源码安装以及平滑升级
  • [特殊字符] Spring AOP 注解方式详解
  • C++——二叉搜索树
  • 青少年机器人技术等级考试理论综合试卷(一级)2020年9月
  • Redis_9_Set
  • 计算机网络培训课程大庆网站建设优化
  • 网站正在建设中永久wordpress 前台文章
  • Electron 桌面应用开发入门指南:从零开始打造 Hello World
  • 深入解析手机快充技术原理与实现
  • JavaScript 数组方法大全
  • 电子商务网站建设与管理的实验报告个人怎样免费建网站
  • STM32F103学习笔记-16-RCC(第3节)-使用HSE配置系统时钟并使用MCO输出监控系统时钟
  • LeRobot 入门教程(十五)从Hub加载环境
  • HTML DOM 总结
  • 社群经济下开源链动2+1模式AI智能名片S2B2C商城小程序的信任重构机制研究
  • Git 命令大全:从基础到高级操作
  • Git_Rebase
  • 【深度学习|学习笔记】异常检测概论 — 从经典算法到深度学习(含实用 Python 示例)
  • 如何建立一个视频网站html5 手机网站页面实例
  • FlutterPlugin接口实现与插件架构设计
  • 图漾GM461-E1相机专栏
  • Flutter与鸿蒙原生MethodChannel通信机制深度解析
  • Navigation2 行为树架构源码级分析与设计原理
  • 基于时频域霍夫变换的汽车雷达互干扰抑制——论文阅读
  • 贵阳网站建设建站系统怎么找网站是由什么建的
  • 一本通网站1128题:图像模糊处理
  • DrissionPage遇到iframe
  • 基于信号分解的FMCW雷达相互干扰抑制——论文阅读
  • 未来的一些想法和规划