zoukankan      html  css  js  c++  java
  • 第十二章继承 简单

    // 4 单一继承
    /*
    #include <iostream>
    using namespace std;
    class fatcher
    {
    private:
    	int height, width;
    public:
    	void setHeight(int h){ this->height = h; }
    	void setWidth(int w){ this->width = w; }
    	void show()
    	{
    	   cout<<"身高="<<height<<" 体重="<<width<<endl;
    	}
    };
    
    class sun : public fatcher
    {
    private:
    	int sunJK, sunPC;
    public:
    	void setSunJK(int j){ this->sunJK = j;}
    	void setSunPC(int j){ this->sunPC = j;}
    	void showSun(){ cout<<"JK:"<<sunJK<<" PC:"<<sunPC<<endl;}
    };
    
    int main()
    {
    	sun a;
    	a.setHeight(170);
    	a.setWidth(50);
    	a.setSunJK(100);
    	a.setSunPC(200);
    	a.show();
    	a.showSun();
        return 0;
    }*/
    
    
    //5 公有型 保护型和私有型
    /*
    #include <iostream>
    using namespace std;
    class fatcher
    {
    //private:
    protected:
    	int height, width;
    public:
    	void setHeight(int h){ this->height = h; }
    	void setWidth(int w){ this->width = w; }
    	void show()
    	{
    	   cout<<"身高="<<height<<" 体重="<<width<<endl;
    	}
    };
    
    class sun : public fatcher
    {
    private:
    	int sunJK, sunPC;
    public:
    	void setSunJK(int j){ this->sunJK = j;}
    	void setSunPC(int j){ this->sunPC = j;}
    	//void showSun(){ cout<<"JK:"<<sunJK<<" PC:"<<sunPC<<endl;}
    	void show(){ 
    	cout<<"身高="<<height<<" 体重="<<width<<endl;
    	cout<<"JK:"<<sunJK<<" PC:"<<sunPC<<endl;}
    };
    
    int main()
    {
    	sun a;
    	a.setHeight(170);
    	a.setWidth(50);
    	a.setSunJK(100);
    	a.setSunPC(200);
    	a.show();
    	//a.showSun();
        return 0;
    }*/
    
    //6 公有派生的公有成员
    /*
    #include <iostream>
    using namespace std;
    class fatcher
    {
    public:
    	void root(){ cout<<"父亲的大房子我也可以享受"<<endl;}
    };
    
    //公有继承对父类的公有属性,就像自己的一样,可以随便用
    class son:public fatcher
    {
        
    };
    int main()
    {
    	son s;
    	s.root();
    	return 0;
    }*/
    
    // 7 公有派生的保护成员
    /*
    #include <iostream>
    using namespace std;
    class fatcher
    {
    protected:
    	void room(){ cout<<"父亲的大房子我也可以享受"<<endl;}
    };
    
    //公有继承对父类的公有属性,就像自己的一样,可以随便用
    //公有继承对像,父类的保护成员在子类中也是保护成员
    class son:public fatcher
    {
    public:
    	void enjoy(){ room(); } //只能通过公用的接口来访问父类的保护成员room()
    
    };
    int main()
    {
    	son s;
    	//s.root(); //无法访问保护成员
    	s.enjoy();
    	return 0;
    }*/
    
    //8 公有派生的私有成员
    /*#include <iostream>
    using namespace std;
    class fatcher
    {
    protected:
    	void room(){ cout<<"父亲的大房子我也可以享受"<<endl;}
    private:
    	void secret(){ cout<<"父亲的密秘"<<endl;}
    };
    
    //公有继承对父类的公有属性,就像自己的一样,可以随便用
    //公有继承对像,父类的保护成员在子类中也是保护成员
    class son:public fatcher
    {
    public:
    	void enjoy(){ 
    	   room(); 
    	   //secret();  不能访问你类的私有成员
    	} //只能通过公用的接口来访问父类的保护成员room()
    
    };
    int main()
    {
    	son s;
    	//s.root(); //无法访问保护成员
    	s.enjoy();
    	return 0;
    }*/
    
    //公有派生的赋值问题
    /*
    #include <iostream>
    using namespace std;
    class father
    {
    public:
    	int x;
    	void show(){ cout<<"x:"<<x<<endl;}
    };
    class son : public father
    {
    public:
    	int y;
    };
    int main()
    {*/
    	/*father Nick;
    	son Jack;
    	Jack.y = 11;
    	Jack.x = 22;
    	Jack.show();
    
    	Nick = Jack; //这里可以将子类的对像赋值给父类,但不能把你类的对像赋值给子类
    
    	Nick.show();*/
    
    	/*father *p;
    	son Jack;
    	p = &Jack;
    	p->x = 3;
    	cout<<p->x<<endl;*/
    /*
    	son Jack;
    	father &Nick = Jack;
    
    
        return 0;
    }*/
    
    // 私有派生
    /*
    #include <iostream>
    using namespace std;
    class father
    {
    public:
    	void room(){cout<<"父亲的大房子我可以享受"<<endl;}
    };
    //私有继承
    //class son: private father
    //保护继承
    class son: protected father
    {
    public:
    	void enjoy(){room();}
    };
    int main()
    {
    	son a;
    	a.enjoy();
    	return 0;
    }*/
    
    // 11 多重继承
    /*
    #include <iostream>
    using namespace std;
    
    class father
    {
    public:
    	void setA(int a){toll = a;}
    	void printA(){ cout<<"身高:"<<toll<<endl;}
    private:
    	int toll;
    };
    
    class mother
    {
    private:
    	int weight;
    public:
    	void setB(int w){ weight = w;}
    	void printB(){ cout<<"体重"<<weight<<endl;}
    };
    
    //class son: public father, public mother
    class son: public father, private mother 
    //以私有方式继承后,基类的私有成员变成不可访问,而公有成员和保护成员也变成了私有,派生类中的成员想要访问他们必须定义一个公有函数作为接口
    
    {
    private:
    	int age;
    public:
    	void setC(int a){ age = a;}
    	void setb(int b){ setB(b);} //必须定义一个公有的接口来访问私有成员,两个成员不可访问的问题
    	void printC(){
    		printA();
    		printB();
    		cout<<"年龄:"<<age<<endl;
    	}
    };
    
    int main()
    {
    	son s;
    	s.setA(170);
    	//s.setB(50);
    	s.setb(50);
    	s.setC(23);
    	s.printC();
        return 0;
    }*/
    
    //12 继承和构造与析构
    /*
    #include <iostream>
    using namespace std;
    class father
    {
    private:
    	int a;
    public:
    	father(int i){ a= i; cout<<"构造基类a的值:"<<a<<endl;}
    	~father(){ cout<<"析构基类a的值"<<a<<endl;}
    };
    class son: public father
    {
    private:
    	int b;
    public:
    	son(int i, int j);
    	~son(){cout<<"析构子类b的值:"<<b<<endl;}
    };
    son::son(int i, int j):father(i)
    {
    	b = j;
    	cout<<"构造子类的b的值:"<<b<<endl;
    };
    int main()
    {
    	son a(11,22);
    
        return 0;
    }*/
    //构造和析构的顺序
    //先构造父类的构造函数,然后构造子类的构造函数
    //先析构子类的析构函数,然后析构父类的析构函数
    
    // 向基类构造函数传递参数
    /*
    #include <iostream>
    #include <string>
    using namespace std;
    class father
    {
    protected:
    	string name;
    	int tall;
    public:
    	father(string a, int i){ name=a, tall=i; cout<<"执行带两个参数的基类对像"<<endl; };
    	father(){cout<<"构造基类"<<endl;}
    	//这里是输出字符串的
    	void print(){cout<<" 身高为:"<<tall<<" Name:"<<name<<endl;}
    	~father(){cout<<"释放基类对像"<<endl;}
    };*/
    
    /*
    father::father(string a, int i)
    {
    	cout<<"\n 在基类的构造函数内\n";
    	name = a;
    	tall = i;
    	print();
    	cout<<"离开基类构造函数"<<endl;
    };*/
    
    /*
    class son:public father
    {
    private:
    	int weight;
    public:
    	son(string a, int i, int j);
    	void print1();
    	~son(){cout<<"离开子类对像"<<endl;}
    };
    son::son(string a, int i, int j):father(a, i)
    {
    	//name = a;
    	//tall = i;
    	weight = j;
    	cout<<"在子类的构造函数内"<<endl;
    };
    void son::print1()
    {
    	father::print();
    	cout<<"体重:"<<weight<<endl;
    }
    
    int main()
    {
    	son Make("Mike",180,77);
    	Make.print1();
    	cout<<"程序执行完成"<<endl;
        return 0;
    }*/
    
    // 向基类构造函数传递参数
    /*
    #include <iostream>
    #include <string>
    using namespace std;
    class father
    {
    protected:
    	string name;
    	int tall;
    public:
    	father(string a, int i);
    	father(){cout<<"构造基类"<<endl;}
    	//这里是输出字符串的
    	void print(){cout<<" 身高为:"<<tall<<" Name:"<<name<<endl;}
    	~father(){cout<<"释放基类对像"<<endl;}
    };
    
    father::father(string a, int i)
    {
    	cout<<"\n 在基类的构造函数内\n";
    	name = a;
    	tall = i;
    	print();
    	cout<<"离开基类构造函数"<<endl;
    };
    
    class son:public father
    {
    private:
    	int weight;
    public:
    	son(string a, int i, int j);
    	void print1();
    	~son(){cout<<"离开子类对像"<<endl;}
    };
    son::son(string a, int i, int j)
    {
    	name = a;
    	tall = i;
    	weight = j;
    	cout<<"在子类的构造函数内"<<endl;
    };
    void son::print1()
    {
    	father::print();
    	cout<<"体重:"<<weight<<endl;
    }
    
    int main()
    {
    	son Make("Mike",180,77);
    	Make.print1();
    	cout<<"程序执行完成"<<endl;
        return 0;
    }
    */
    
    //多重继承容易产生两义性
    /*
    #include <iostream>
    using namespace std;
    class A
    {
    public:
    	void hello(){cout<<"基类A的hello函数"<<endl;}
    };
    class B
    {
    public:
    	void hello(){cout<<"基类B的hello函数"<<endl;}
    };
    
    class C : public A, public B
    {
    public:
    	void hello(){cout<<"基类C的hello函数"<<endl;}
    };
    
    
    int main()
    {
    	C c;
    	c.hello(); //这里多重继承容易产生两义性
        c.A::hello(); //这里可以去掉两义性
    	c.B::hello();
    
    
        return 0;
    }
    */
    
    //15 继承中的重载
    /*
    #include <iostream>
    using namespace std;
    class father
    {
    public:
    	void hello(){cout<<"基类的事带参数的hello函数"<<endl;}
    	void hello(int i){ cout<<"基类的带一个参数hello函数"<<endl;}
    };
    class son:public father
    {
    public:
    	void hello(){cout<<"子类的事带参数的hello函数"<<endl;}
    	//当我们在子类中定义一个与基类同名的函数时,那么等于是告诉编译器,用子类的函数覆盖掉基类的同名函数,同时将它重载函数隐藏起来.
    	
    	void hello()const{cout<<"子类的事带参数的const hello函数"<<endl;}
    	//这里与hello()函数是不一样的,因为hello()const函数只能被const对像所调用
    
    
    	void hello(int i){ cout<<"子类的带一个参数hello函数"<<endl;}
    };
    int main()
    {
        son s;
    	s.hello();
    	//s.hello(2); //将不能再访问了
    	
    	const son ss;
    	ss.hello();
    
    	return 0;
    }*/
    
    
    /*
    #include <iostream>
    using namespace std;
    class A
    {
    public:
    	void hello(){cout<<"基类A的hello函数"<<endl;}
    	void hello(int i)
    	{
    	    cout<<"a.hello(i):"<<i<<endl;
    		cout<<"基类a的带一个参数的hello函数"<<endl;
    	}
    };
    class B : public A
    {
    public:
    	//void hello(){ cout<<"子类b的hello函数"<<endl;}
    	//还是一种方法是添加const,这样就不会把父类的函数隐藏起来了
    	void hello()const{  cout<<"子类b的hello函数"<<endl;}
    	void hello(int i)const{
    		    cout<<"b.hello(i):"<<i<<endl;
    		    cout<<"子类B的带一个参数的hello函数"<<endl;
    	}
    };
    
    int main()
    {
    	B b;
    	b.hello();
    	b.hello(11);
    
    
    	//b.hello(11); //把带参的重载函数会是被隐藏起来了
    	//b.A::hello(11); //呵呵,这样也行,不握你隐藏起来
        return 0;
    }*/
    
    // 16 两义性的归属问题
    
    //一个派生类从多个基类派生,而这些基类双有一个共同的基类,那么在派生类中访问共同的基类中的成员时会产生两义性
    /*
    #include <iostream>
    using namespace std;
    class Human
    {
    public:
    	void stand(){cout<<"人类能够直立行走"<<endl;}
    };
    
    class father: public Human
    {
    
    };
    class mother: public Human
    {
    
    };
    class son : public father, public mother
    {
    
    };
    int main()
    {
    	son s;
    	//s.stand();//两义性的归属问题
    	s.mother::stand();
        return 0;
    
    }*/
    
    
    //17 虚基类不会产生两义性
    /*
    #include <iostream>
    using namespace std;
    
    #include <iostream>
    using namespace std;
    class Human
    {
    public:
    	void stand(){cout<<"人类能够直立行走"<<endl;}
    };
    //virtual 声明为虚基类
    class father:virtual public Human
    {
    
    };
    class mother:virtual public Human
    {
    
    };
    class son : public father, public mother
    {
    
    };
    int main()
    {
    	son s;
    	//s.stand();//两义性的归属问题
    	//s.mother::stand();
    	s.stand();
    	return 0;
    
    };*/
    
    
    #include <iostream>
    using namespace std;
    
    #include <iostream>
    using namespace std;
    class Human
    {
    public:
    	void stand(){cout<<"人类能够直立行走"<<endl;}
    };
    //virtual 声明为虚基类
    class father:virtual public Human
    {
    public:
    
    	void stand(){cout<<"父类能够直立行走"<<endl;}
    };
    class mother:virtual public Human
    {
    public:
    
    	void stand(){cout<<"母类能够直立行走"<<endl;}
    };
    class son : public father, public mother
    {
    public:
    void stand(){cout<<"子类能够直立行走"<<endl;}
    
    };
    int main()
    {
    	son s;
    	s.stand();
    
    	father f;
    	f.stand();
    
    	mother m;
    	m.stand();
    
    	Human h;
    	h.stand();
    	return 0;
    };
    

      

  • 相关阅读:
    在Arduino IDE中安装ESP32 Filesystem Uploader
    人工智能必备数学基础:线性代数基础(1)
    人工智能必备数学基础:高等数学基础(3)
    迟到的=2020=年终总结
    常用软件-官方下载地址
    海康、大华的RTSP地址规则说明及通道问题(重点)
    各类服务器性能的瓶颈分析
    分析影响流媒体服务器性能的硬件瓶颈
    linux下程序、动态库、静态库内部添加版本号和编译时间与Windows下Qt 如何给程序添加版本信息
    css link import 两者之间的区别
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/2572409.html
Copyright © 2011-2022 走看看