public、protected和private继承
来源:互联网 发布:sql 删除语句 编辑:程序博客网 时间:2024/04/29 09:30
网上找了很多关于c++中这三者在继承方面的文章,貌似都不够全面。将几篇我觉得不错的文章整合了一下,方便大家查阅。
首先贴一个转载比较多的帖子:
http://blog.csdn.net/wuliming_sc/archive/2009/01/18/3827743.aspx
在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public继承是最为常用的一种继承关系,private继承是最少见的继承关系。
1. public
从语义角度上来说,public继承是一种接口继承,根据面向对象中的关系而言就是,派生类可以代替基类完成基类接口所声明的行为,也就是必须符合“Liskov替换原则(LSP)”,此时派生类可以自动转换成为基类的接口,完成接口转换。
从语法角度上来说,public继承会保留基类中成员(包括函数和变量等)的可见性不变,也就是说,基类的public成员为派生类的public成员,基类的protected成员为派生类的protected成员。
2. protected
从语义角度上来说,protected继承是一种实现继承,根据面向对象中的关系而言就是,派生类不能代替基类完成基类接口所声明的行为,也就是不符合“Liskov替换原则(LSP)”,此时派生类不能自动转换成为基类的接口,就算通过类型转换(static_cast和dynamic_cast)也会得到一个空指针。
从语法角度上来说,protected继承会将基类中的public可见性的成员修改成为protected可见性,相当于在派生类中引入了protected成员,这样一来在派生类中同样还是可以调用基类的protected和public成员,派生类的派生类就也可以调用被protected继承的基类的protected和public成员。例如:
class CSample1 {
protected:
void printProtected() {}
public:
void printPublic() {}
};
class CSample2 : protected CSample1 {};
class CSample3 : public CSample2 {
void print3() {
printProtected();
printPublic();
}
};
3. private
从语义角度上来说,private继承是一种实现继承,根据面向对象中的关系而言就是,派生类不能代替基类完成基类接口所声明的行为,也就是不符合“Liskov替换原则(LSP)”,此时派生类不能自动转换成为基类的接口,就算通过类型转换(static_cast和dynamic_cast)也会得到一个空指针。
从语法角度上来说,private继承会将基类中的public和protected可见性的成员修改成为private可见性,这样一来虽然派生类中同样还是可以调用基类的protected和public成员,但是在派生类的派生类就不可以再调用被private继承的基类的成员了。
class CSample1 {
protected:
void printProtected() {}
public:
void printPublic() {}
};
class CSample2 : private CSample1 {};
class CSample3 : public CSample2 {
void print3() {
printProtected(); // 编译错误,不可以调用该函数
printPublic(); // 编译错误,不可以调用该函数
}
};
4. using声明
如果进行private或protected继承,则基类成员的访问级别在派生类中比在基类中更受限:
class Base{
public:
std::size_t size() const {return n;}
protected:
std::size_t n;
}
class Derived : private Base{...};
在这一继承层次中,size在Base中为public,但在Derived中为private。为了使size在Derived中成为public,可以在Derived的public部分增加一个using声明。如下这样改变Derived的定义,可以使size成员能够被用户访问,并使n能够被从Derived派生的类访问:
class Derived : private Base{
public:
using Base::size;
privated:
using Base::n;
//...
}
用struct和class保留字定义的类具有不同的默认访问级别。同样,默认继承访问级别根据使用哪个保留字定义派生类也不相同。使用class保留字定义的派生类默认具有private继承,而用struct保留字定义的类默认具有public继承:
class Base{/*...*/}
struct D1 : Base{/*...*/}; //public inheritance by default
class D2 : Base{/*...*/}; //private inheritance by default
有一种常见的误解认为用struct保留字定义的类与用class定义的类有更大的区别。实际上它们唯一的不同只是默认的成员保护级别和默认的派生保护级别,除此之外,再也没有其他的区别。
总的来说上面这个帖子写的挺不错的,可欠缺的是它隐藏了一些关系,如public的继承中,对父类各变量的访问权限及总的继承关系表。下面转载了一篇来自csdn上的帖子,对这方面加了一些说明:
class b:public a{} 继承的含义是b可以访问a中public, protected成员,但是不能访问a中private成员。
class b:protected a{} 继承的含义是b可以访问a中public, protected成员,并将a中public, protected成员转成protected成员,同时也不能访问a中private成员。
class b:private a{} 继承的含义是b可以访问a中public,protected成员,将a中public,protected成员转成private成员,不能访问a中private成员,同时如果b类再派生出子类的话(假设为c),那么c类将不可访问a类中的任何成员。
关系表如下:
继承方式 public private protected
public public private protected
private private private private
protected protected private protected
- public private 和protected 继承
- public、protected和private继承
- public、protected和private继承
- public private 和protected 继承
- public private 和protected 继承
- public private 和protected 继承
- public、private和protected继承
- public private 和protected 继承
- public private 和protected 继承
- public private 和protected 继承
- public private 和protected 继承
- public private 和protected 继承
- public、protected和private继承
- public、private、protected继承
- public、protected、private继承
- public, private和protected继承比较
- 小结,继承中的public、protected和private
- C++ Public, Private和 Protected 继承
- 操纵比赛 game-rigging
- To push one's luck 得寸进尺
- 终于还是与校园网诀别了,= =
- 德国大众跃居世界第一大汽车生产商
- [英语阅读]法国举办首届离婚博览会
- public、protected和private继承
- 老鼠仓 rat trading
- 善待他人 赢得合作
- November 9th Monday
- 海量数据处理分析
- 嵌入式POS商业应用平台分析
- Win32 OpenGL编程(11) 光照
- 利用Thunk让C++成员函数变回调函数
- 性能测试笔试题