// 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;
};