继承:是类之间定义的一种重要关系。
按照生活中的思考方式的话,就是继承老一辈的手艺并且在新的一辈中得到创新与传承,这里只不过是用在了类的关系上面,即老类与新类,父类与子类
继承举例:
//写一个继承
//父类
#include<iostream>
using namespace std;
class Father
{
public:
void fun()
{
cout<<"这个是Father的功能"<<endl;
}
};
//子类:访问属性 父类
class Son:public Father
{
};
void text()
{
Son s;
s.fun();//这个例子表明,就是可以直接调用子类来访问到父类的东西
}
int main()
{
text();
system("pause");
return 0;
}
以上的例子只是简说,原来子类可以调用一些父类的函数,数据,但不是所有的父类的东西都可以被调用,就下面细说,这个例子只是个入门。
#include<iostream>
using namespace std;
class Father
{
public:
Father()
{
cout<<"Father的构造"<<endl;
}
~Father()
{
cout<<"Father的析构"<<endl;
}
int a;
protected:
int b;
private:
int c;
};
class Son:public Father
{
public:
Son()
{
cout<<"Son的构造"<<endl;
}
~Son()
{
cout<<"Son的析构"<<endl;
}
};
void text()
{
Son s;
}
int main()
{
text();
system("pause");
return 0;
}
这张图片演示了上面的构造和析构函数的运算过程,先父类再子类
类的访问方式有三种,即public访问,protected访问,private访问
对于继承来说,也有三种,即public继承,protected继承,private继承
用以下表格来说明:
继承的说明
1,子类可以拥有父类的所有成员变量和成员函数
2,子类可以当作是一个特殊的父类
3,子类对象可以当作父类对象来使用
4,子类可以拥有父类没有的方法和属性
最好用public继承,这样可以最大限度保留父类成员的属性
父类和子类有重名的成员,子类对象直接调用用的子类自己的成员
在有重名的情况下,还想调用父类的成员的话,需要在成员前面加父类名::
如:(这样的话,就可以可以处理二义性了)
cout<<s.Father::a<<endl;
多继承:就是子类继承了多个父类,拥有多个父类的功能(强啊!!!!!!)
不过,多继承容易产生二义性,那么这样的话就可以用上面的二义性解决办法就可以了
多继承调用构造函数的顺序是,先继承的先调用,而析构函数是相反的过程
举一个要用的例子:
菱形继承:具体继承过程如下图绘出
从A到D有两条路,那就会调用A两次,解决方法,在B,C类调用A的时候,在前面加virtual
加这个的好处就是追寻基本,调用一次就可以了
出现二义性,依旧是用上面的解决方法。
#include<iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A构造"<<endl;
}
int a=10;
};
class B:virtual public A
{
};
class C:virtual public A
class D:public B,public C
{
}
int main()
{
system("pause");
return 0;
}