这篇文章主要介绍了C++中的继承模式有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
继承是OOP设计中的重要概念。在C++语言中,派生类继承基类有三种继承方式:私有继承(private)、保护继承(protected)和公有继承(public)。
继承是C++中的重要特性,派生类可以访问基类中的protected和public成员
先上代码:
#include<iostream> using namespace std; class Base { private: void func_pri(); protected: void func_pro(); public: void func_pub(); }; void Base::func_pri() { cout << "private" << endl; } void Base::func_pro() { cout << "protected" << endl; } void Base::func_pub() { cout << "public" << endl; this->func_pri(); } class Derive:public Base { public: void function(); }; void Derive::function() { //func_pri();调用private成员会产生编译错误 func_pro(); func_pub(); } int main() { Derive* derive; derive=new Derive; derive->function(); //output: //protected public private delete derive; return 0; }
酱在这里用一段简单地代码为大家说明了继承的规则。派生类只能访问基类的public和protected成员,无法访问private成员;若要调用类中private成员,要在类内部使用this指针传参(关于this指针的用法,酱在后续文章中会为大家进一步整理)。这里Derive是public Base,是公有继承。
上表:
首先要确立一个概念:无论是公有、私有还是保护继承,说到底它们都属于继承,满足继承的基本规则(如上表)。无论是private、protected还是public,对于直接向基类继承的派生类来说几乎没有影响(即俗称的“子代”而非“孙子代”)。上面的代码class Derive:public Base
换成private Base和protected Base
,结果都是一样的。
影响的是派生类的继承,即“孙子代”。
1.保护继承
先上代码:
#include<iostream> using namespace std; class Base { private: void func_pri(); protected: void func_pro(); public: void func_pub(); }; void Base::func_pri() { cout << "private" << endl; } void Base::func_pro() { cout << "protected" << endl; } void Base::func_pub() { cout << "public" << endl; this->func_pri(); } class Derive:protected Base { public: void function(); }; void Derive::function() { func_pro(); func_pub(); } class Derive_sec:public Derive { public: void func_sec(); }; void Derive_sec::func_sec() { func_pub(); func_pro(); //func_pri();调用这里时会产生错误 } int main() { Derive_sec* derive; derive=new Derive_sec; derive->func_sec(); delete derive; return 0; }
这段代码运行后的结果是public protected。
可以看出的是Derive_sec类(子二代)可以调用的是Base基类的protected和public成员函数,而无法调用private成员函数。
2.私有继承
先上代码:
#include<iostream> using namespace std; class Base { private: void func_pri(); protected: void func_pro(); public: void func_pub(); }; void Base::func_pri() { cout << "private" << endl; } void Base::func_pro() { cout << "protected" << endl; } void Base::func_pub() { cout << "public" << endl; this->func_pri(); } class Derive:private Base { public: void function(); }; void Derive::function() { func_pro(); func_pub(); } class Derive_sec:public Derive { public: void func_sec(); }; void Derive_sec::func_sec() { //func_pub();调用时会产生错误 //func_pro();调用时会产生错误 //func_pri();调用这里时会产生错误 function(); } int main() { Derive_sec* derive; derive=new Derive_sec; derive->func_sec(); delete derive; return 0; }
通过结果来看,Derive_sec类(子二代)对Base基类中private、protected和public的成员函数均不能调用,但其仍然可以调用子一代的公有函数。
在三种模式的继承中,我们可以看出当子一代设置为公有继承/保护继承基类时,子二代对基类protected、public成员变量可以访问,而对private变量不可访问;当子一代设置为私有继承基类时,子二代对基类private、protected、public成员变量均不能访问.
我们可以得出这样的结论:当基类和派生类具有直接继承关系时,按照上文所述继承规则即可;若派生类是经过对基类的多重继承得来的,则要考虑之前的继承模式。
private继承模式在对类之间的封装性有要求时,可以考虑使用。
感谢你能够认真阅读完这篇文章,希望小编分享的“C++中的继承模式有哪些”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。