C++中的继承模式深入详解

这篇文章主要介绍了C++中的继承模式深入详解。继承是OOP设计中的重要概念。在C++语言中,派生类继承基类有三种继承方式:私有继承(private)、保护继承(protected)和公有继承(public)。

前言

继承是OOP设计中的重要概念。在C++语言中,派生类继承基类有三种继承方式:私有继承(private)、保护继承(protected)和公有继承(public)。

一、继承规则

继承是C++中的重要特性,派生类可以访问基类中的protected和public成员
先上代码:

 #include 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 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 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++中的继承模式深入详解的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » C语言