zoukankan      html  css  js  c++  java
  • 谈谈C++私有继承

    很多C++程序猿从来没用过私有继承来设计他的类。的确,假设是本该用私有继承的地方却用了公有继承。对程序的功能的实现并无影响。

    但这样的误用是一种错位的描写叙述。会引起阅读者的误解,甚至会引起类的使用者的茫然。当我们在写一个类的声明的时候,实际上是在做一个意图的设计。而设计者须要的恰恰是精确描写叙述。

    • 私有继承的弦外之音

    要解释私有继承。我们先来看看共同拥有继承,好做个比較。

    公有继承,本质上就是 is-a 的关系。如。描写叙述吉普车是一种车。那么能够进行下面的设计:

    class Car
    {
    };
    
    class Jeep : public Car
    {
    }

    私有继承,子类仅仅能在类内部使用父类的功能,而不能将父类的功能以接口的形式开放给外部,也就是说。子类的对象无法直接使用到父类的功能接口。所以。私有继承的涵义就成了:子类能够借助父类的功能来实现自己的功能

    这就是典型的has-a 的关系。

    class Engine
    {
    public:
        void Run();
    };
    
    class Car : private Engine
    {
    public:
        void Drive()
        {
            // let engine go!
            Run();
        }
    };
    在关系描写叙述上,等同于组合【严格意义上不能说是等同,由于毕竟私有继承的方式还能够同意继承类使用基类的protected成员,而通过组合方式的是无法使用被组合的类的protected成员的】。如:

    class Car
    {
        ...
    private:
        Engine m_engine;
    }

    • 私有继承VS组合

    私有继承带来过多的程序开销,而组合却是短平快,所以一般来说。设计者想描写叙述Has-A的关系时。组合方式是首选的

    但下面两种方式则必须使用私有继承:

    1. A类须要使用B类的protected成员函数来实现自己的功能时
    2. A类须要重写B类的虚函数时




  • 相关阅读:
    实验6 多态性
    js实现图片轮播
    xcode 4.6 使用NSURLConnection 获取网页内容(iOS6.1,纯手工编码,无xib,无storyboard)
    蓝牙API
    php使用microtime(true)查看代码执行时间
    clover无缘无故隐藏书签栏原因
    RedisGEO
    mysql 新特性之geometry
    mysql中geometry类型的简单使用
    微软Windows Phone 7新特性详解 狼人:
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6843786.html
Copyright © 2011-2022 走看看