zoukankan      html  css  js  c++  java
  • Effective C++ Item 40 明智而审慎地使用多重继承

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


    经验:多重继承比单一继承复杂。它可能导致新的歧义性,以及对 virtual 继承的须要

    演示样例:
    class BorrowableItem{
    public:
    	void checkOut();
    };
    class ElectronicGadget{
    private:
    	bool checkOut() const;
    };
    class MP3Player:
    	public BorrowableItem
    	public ElectronicGadget
    {...};
    MP3Player mp;
    mp.checkOut()


    解析:找出最佳函数后才检验其可取用性。此例中对 checkOut 的调用是歧义的,即使两个函数中仅仅有一个是可取用的(一个 public , 一个 private)
    纠正:明白说明调用的是哪一个 base class 内的函数
    mp.BorrowableItem::checkOut();

    经验: virtual 继承会添加�大小、速度、初始化(及赋值)复杂度等等成本。假设  virtual base classes 不带不论什么数据,将是最具有用价值的情况


    经验:多重继承的确有正当用途。当中一个情节涉及“public 继承某个 Interface class”和"private继承某个协助实现的 class"的两相组合。
    演示样例:
    class IPerson{ //提供接口
    public:
    	static std::tr1::shared_ptr<Person> makePerson(DatabaseID personIdentifier);
    	virtual ~IPerson();
    	virtual std::string name() const = 0;
    	virtual std::string birthDate() const = 0;
    };
    
    
    class PersonInfo{ //提供实现
    public:
    	explicit PersonInfo(DatabaseID pid);
    	virtual ~PersonInfo();
    	virtual const char *theName() const;
    	virtual	const char *theBirthDate() const;
    	virtual const char *valueDelimOpen() const;
    	virtual const char *valueDelimClose() const;
    	//...
    };
    
    
    class CPerson: public Iperson, private PersonInfo{
    public:
    	explicit CPerson(DatabaseID pid): PersonInfo(pid){}
    	virtual std::string name() const{ 
    		return PersonInfo::theName(); //利用 PersonInfo 的方法实现 IPerson 的接口
    	}
    	virtual std::string birthDate() const{
    		return PersonInfo::theBirthDate();
    	}
    private:
    	const char *valueDelimOpen() const {return "";} //又一次定义继承而来的 virtual "界限函数"
    	const char *valueDelimClose() const {return "";}
    }
    
    
    DatabaseID askUserForDatabaseID();
    
    
    DatabaseID id(askUserForDatabaseID());
    std::tr1::shared_ptr<IPerson> pp(makePerson(id));


  • 相关阅读:
    CentOS命令修改系统时间同步
    Redis的两种持久化方式-快照持久化(RDB)和AOF持久化
    Mysql优化_内置profiling性能分析工具
    Samba服务器的安装与配置
    Linux下yum安装MysqL数据库
    CentOS下安装配置cmake
    自定义环形进度条
    教你实现语音识别(基于科大讯飞)
    Eclipse中如何安装和使用GrepCode插件
    如何在代码中动态设置字体大小
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4006903.html
Copyright © 2011-2022 走看看