定义
继承机制使用已经定义的类作为基础建立新的类的定义,新的类是原有类的数据及操作与新类所增加的数据及操作的组合。新的类把原有的类作为基类引用,而不需要修改原来的类的定义。
继承格式
class默认访问控制为private
class 派生类名:访问控制 基类名表
{
数据成员和成员函数的说明
};
继承方式
方式 | 说明 |
---|---|
公有继承 | 访问权限不变 |
私有继承 | 访问权限变为私有 |
保护继承 | 访问权限变为保护 |
重名成员
#include<iostream>
using namespace std;
class Base{
public:
int a,b;
};
class Derived:public Base{
public b,c;
};
int main(){
Derived d;
d.a=1;
d.Base::b=2;//显示指明是哪个类型的b
d.b=3;
d.c=4;
}
重名成员函数
#include<iostream>
using namespace std;
class A{
public:
int a1,a2;
A(int i1=0,int i2=0){
a1=i1;
a2=i2;
}
void print()
{ cout<"a1="<<a1<<'\t'<<"a2="<<a2<<endl; }
};
class B:public A{
public:
int b1,b2;
B(int j1=1,int j2=1){
b1=j1;
b2=j2;
}
void print()//定义同名函数
{ cout<<"b1="<<a1<<'\t'<<"a2="<<a2<<endl;}
void printAB(){
A::print();//显示指明为A类的print
print();
};
注意
- 先创建基类,再创建派生类;
- 先析构派生类,再析构基类;
多继承
- 定义:一个派生类从多个基类派生处理,称为多继承。
- 基类构造函数的执行顺序取决与定义派生类时指定各个继承基类的顺序。
class Base1{
public:
Base1(int x)
{ value=x; }
int getData()const
{ return value; }
protected:
int value;
}
class Base2{
public:
Base2(char c)
{ letter=c; }
char getData()const
{ return letter; }
protected:
char letter;
};
class Derived:public Base1, public Base2{
friend ostream & operater<<(ostream output, const Derived &);
public:
Derived(int,char,double);
double getReal()const;
private:
double real;
};
Derived::Derived(int i,char c,double f):Base1(i),Base2(c),real(f){}
double Derived::getReal()const
{ return real; }
ostream & operator<<(ostream & output,const Derived & d){
output<<d.value<<d.letter<<d.real<<endl;
return output;
}
虚继承
定义:一个类不能被多次说明为一个派生类的直接基类,但可以不止一次地成为间接基类;虚继承即保证多次成为间接基类的数据 函数,只有一个版本。
- 非虚继承
class B{public:int b;};
class B1:public B{ public:int b1;};
class B2:public B{public:int b2;};
class D:public B1,public B2{public:int d;};
void test(){//有两个不同类的b
D dd;
dd.B1::b=5;
dd.B2::b=10;
dd.b1=25;
dd.b2=100;
dd.d=140;
}
- 虚继承
class B{public:int b;};
class B1:virtual public B{public:int b1;};
class B2:virtual public B{public:int b2;};
class D:public B1,pulicB2{public:int d;}
void test(){//只有一个版本的基类B的b
D dd;
dd.b=100;
dd.b1=90;
dd.b2=80;
dd.d=70;
}