一.基本概念
1.多继承是指派生类具有两个或两个以上的直接基类。
2.多重继承可以看做是单继承的扩展,派生类和每个基类之间的关系可以看做是一个单继承。
3.多继承声明语法
class 派生类名: 访问控制 基类名1, 访问控制 基类名2, …, 访问控制 基类名n
{
数据成员和成员函数声明
};
其中不同的基类可以选择不同的继承方式。
二.多继承的派生类构造和访问
1.多个基类的派生类构造函数可以用初始化列表调用基类构造函数初始化数据成员。
派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),…,基类名n(参数表n)
{
// 派生类新增成员的初始化语句
}
2.执行顺序与单继承构造函数情况类似。多个直接基类构造函数的执行顺序取决于定义派生类时指定的各个继承基类的顺序。
3. 一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别。
4. 多继承方式下构造函数的执行顺序:
•先执行所有基类的构造函数
•再执行对象成员的构造函数
•最后执行派生类的构造函数
处于同一层次的各基类构造函数的执行顺序取决于定义派生类时所指定的基类顺序
#include <iostream>
using namespace std;
class Base1
{
public:
Base1(int x)
{
value = x ;
cout<<"Base1 "<<value<<endl;
}
int getData( ) const
{
return value ;
}
protected:
int value;
};
class Base2
{
public:
Base2(char c)
{
letter=c;
cout<<"Base2"<<endl;
}
char getData( ) const
{
return letter;
}
protected:
char letter;
};
class Derived : public Base1, public Base2
{
public :
Derived ( int x, char c, double d,int bb ) :Base1(x),Base2(c),real(d),b1(bb)
{
cout<<"Derived"<<endl;
};
double getReal( ) const
{
return real;
};
friend ostream & operator<< ( ostream &output, const Derived & );
private :
double real ;
Base1 b1;
};
int main( )
{
Base1 b1 ( 10 ) ;
Base2 b2 ( 'k' ) ;
Derived d ( 5, 'A', 2.5,8 ) ;
return 0;
}
/*
Base1 10
Base2
Base1 5
Base2
Base1 8
Derived
*/
5.析构函数名同样与类名相同,无返回值、无参数,而且其定义方式与基类中的析构函数的定义方式完全相同。
析构函数的执行顺序
首先对派生类新增的数据成员进行清理
再对派生类对象成员进行清理
最后才对基类继承来的成员进行清理
#include <iostream>
using namespace std;
class Base1
{
public:
Base1(int x)
{
value = x ;
cout<<"Base1 "<<value<<endl;
}
int getData( ) const
{
return value ;
}
~Base1()
{
cout<<"~Base1 "<<value<<endl;
}
protected:
int value;
};
class Base2
{
public:
Base2(char c)
{
letter=c;
cout<<"Base2 "<<letter<<endl;
}
char getData( ) const
{
return letter;
}
~Base2()
{
cout<<"~Base2 "<<letter<<endl;
}
protected:
char letter;
};
class Derived : public Base2, public Base1
{
public :
Derived ( int x, char c, double d,int bb ) :Base1(x),Base2(c),real(d),b1(bb)
{
cout<<"Derived"<<endl;
};
double getReal( ) const
{
return real;
};
~Derived()
{
cout<<"~Derived "<<endl;
}
private :
double real ;
Base1 b1;
};
int main( )
{
Base1 b1 ( 10 ) ;
Base2 b2 ( 'k' ) ;
Derived d ( 5, 'A', 2.5,8 ) ;
return 0;
}
/*
Base1 10
Base2 k
Base2 A
Base1 5
Base1 8
Derived
~Derived
~Base1 8
~Base1 5
~Base2 A
~Base2 k
~Base1 10
*/