深入了解C++继承
来源:互联网 发布:知乎三国和战国 编辑:程序博客网 时间:2024/05/22 03:32
private、public、protected和friend深入理解,不说话,直接上代码//派生类(derived)分为单继承(inherit)和多继承。基类是对派生类的抽象,派生类是对基类的具体化,是基类的延续。派生类也可以看做是基类的组合(多继承)//公有派生类的对象可以作为基类的对象处理。格式:class <派生类名称>:<继承方式><基类名>。继承方式:(virtual) private,public,protected./*//继承的访问权限:基类中的私有成员在派生类中是隐藏的,只能在基类内部访问,一般通过public函数访问派生类中成员不能访问基类的private成员,但可以访问基类中的public和protected成员。派生类从基类public继承时,基类的成员类型都不变,public\private\protected仍然是public\private\protected。派生类从基类private继承时,基类的pbulic和protected成员都变成private成员。而基类的private成员不能被访问。派生类从基类protected继承时,基类的public成员在派生类中变为protected成员,protected成员仍为protected成员。*/// //类和结构体的区别:类的成员默认为private,而结构体的成员默认为public//关于继承:class的继承默认是private继承方式,而结构体是public继承方式#include<iostream>using namespace std;class base{public://base();//~base();void init() {};void inita(int x){a = x;}int geta() { return a; }private:int a;};class Derived :public base { //public继承public:void init() {};void initb(int y) { b = y; }int getb() { return b*geta(); }//调用基类public成员private:int b;};class private_Derived :private base {//private继承方式public:void initc(int y, int x){c = y;//a = x; 不合法,因为a是基类private成员 ,不能直接访问inita(x); //合法}int getc(){return c*geta();//调用基类成员函数}private:int c;};//protected成员 :private继承或public继承,都需要通过函数接口访问,这样很不方便,因此出现了protected成员:可以被本类或派生类的成员函数访问,但不能被外部函数访问。class pro_base {public:int a;void setbc(int x, int y){b = x;c = y;}int getb() { return b; }int getc() { return c; }protected:int b;private:int c;};//protected继承class pbase_pro :/*protected*/ pro_base {public:void setbcp(int x, int y, int z){b = x; //b可以直接访问//c = y;//非法setbc(x, y);p = z;}int getp() { p = p + b*getc();return p;}private:int p;};//派生类直接访问基类成员://派生类不能直接访问基类private成员,若要访问必须使用基类的成员函数接口访问。但也是有方法的:/*直接访问基类private成员的方法有两种1、增加基类protected成员。2、将需要访问基类私有成员的派生类成员函数声明为友元。*/class fbase { //友元public:int x;friend class Derived2;protected:int y;private:int z;};class Derived1 :virtual fbase {public://int getz() { return z; } //非法,基类私有成员不可以直接访问int gety() { return y; } //基类protected成员派生类可以直接访问。int getx() { return x; }};class Derived2 :virtual fbase {public:void setz(int a) { z = a; }//直接访问int getx();int getz();int gety();};int Derived2::getx(){return x;}int Derived2::getz(){return z;//友元可以直接访问基类private成员}int Derived2::gety(){return y; //基类protected成员可以被派生类直接访问}int main(int argc,char** argv){/*Derived de;//public继承使用案例de.inita(12);de.initb(5);cout << de.getb() << endl; de.init();//默认调用派生类Derived中的init()de.base::init();//要调用基类中的init()必须加base::init()限定。*//*private_Derived pd; //private继承使用案例//pd.geta();//非法pd.getc(); *//*pbase_pro ob; //protected继承使用 案例//ob.setbc();//非法,外部函数不可以直接访问 基类protected继承来的成员ob.setbcp(1, 2, 3);//合法cout << ob.getp()<<endl; */int i(0);//友元使用案例Derived2 fb;fb.setz(6);i = fb.getz();cout << i << endl;return0;}
1 0
- 深入的了解继承
- 深入了解C++继承
- 深入了解css继承性
- javascript深入了解(继承)
- 深入了解C语言
- 深入了解C语言
- 深入了解C语言
- 深入了解C语言
- 深入了解C语言
- 深入了解C语言
- 深入了解C语言
- 【C++】继承的简单了解!!!
- 深入了解javascript中的prototype与继承
- 深入了解C语言(1)
- c语言的深入了解
- Objective-C Runtime 深入了解
- 深入了解CSS的继承性及其应用
- 深入了解.NET中继承和多态(上)
- HDU 1024 Max Sum Plus Plus DP
- Radix-2 Iterative-FFT
- 社会统计分析—统计推断-估值
- 子线程 run() 函数中,调用其他函数
- Spring中自动任务的实现
- 深入了解C++继承
- HDU 5319 Painter(模拟 + 规律)——2015 Multi-University Training Contest 3
- 怎样用conda安装opencv
- python从零开始学习(三)--os模块
- HTTP缓存
- Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法
- POJ 1376 Robot(BFS)
- AC自动机水题
- NSIndexSet基本用法