百思不得其解,protected到底有什么存在的必要?
原谅我重提protected这个被讨论烂了的关键字,只是我是在想不出来什么场景下必须protected不可,刚才看了一下《C++语言的设计与演化》中关于保护成员的论述,仍然没看出个所以然。
[解决办法]
好吧,我简单举例,模拟Qt中常见的模式:委托模式的写法
class ToolPrivate // 正如,下面所示,外界无法构造该对象。只能被继承类在堆上构建。
{
protected:
ToolPrivate( void );
~ToolPrivate( void );
......
private:
// 屏蔽堆上构建、拷贝构建,赋值操作
ToolPrivate * operator new( void ) = 0;
ToolPrivate operator = ( void ) = 0;
ToolPrivate( ToolPrivate & ) = 0;
.....
}
class Tool : public ToolPrivate
{
ToolPrivate toolPrivate; // 我可以在栈上创建自己的方法类
}
class Player
{
public:
//some functions and virtual functions
protected :
virtual Skill const& get_money();
virtual Skill const& get_skill();
virtual Money const& set_money(int, int);
virtual Money const& set_skill(std::string const&, int);
};
//Haken : 角色名
class Haken : public Player
{
//...
};
struct IamOpen
{
//don't access these data
int num_;
int money_;
};
class IamClose
{
private :
int num_;
int money_;
};
还是透过文件警告users?
文件和注解很重要,但是都远不如代码重要
最后一点,继承少用
对待继承只有两种态度
第一 : 不要用他
第二 : 谨慎的使用他
code complete和exceptional c++对此都有着墨
exceptional c++对继承的利弊和使用时机分析的相当好
[解决办法]
啊,我的player忘了加上virtual destructor
其实现在有很多技术可以使用
随着std::bind,std::function和lambda的出现
以及越来越强大的template
在c++中,继承的地位已经不如当年那么重要了
[解决办法]
既然LZ已经知道三者的区别,这个问题就没有什么好讨论的了,
语言标准就是这么定的,你可以有很多种实现这种机制或者语法表述的方式,
但C++选择了此种方式,清晰而明了,兼顾了多种情况,似乎不存在不方便的地方,
你可以只用public,但语言标准修改是个大事情。
[解决办法]