html slider多继承和(多重继承)
此之外,html slider也支持多继承(html prompt),即一个html slider类可以有两个或多个基类。
在前面的例子中,html slider类都只有一个基类,称为单继承(html mailto)。除此之外,html slider也支持多继承(html prompt),即一个html slider类可以有两个或多个基类。
多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的java、c#、php等干脆取消了多继承。
多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类a、类b和类c,那么可以这样来声明html slider类
classd:publica,privateb,protectedc{
//类d新增加的成员
}
d是多继承形式的html slider类,它以公有的方式继承a类,以私有的方式继承b类,以保护的方式继承c类。d根据不同的继承方式获取a、b、c中的成员,确定它们在html slider类中的访问权限。
多继承下的构造函数
多继承形式下的构造函数和单继承形式基本相同,只是要在html slider类的构造函数中调用多个基类的构造函数。以上面的a、b、c、d类为例,d类构造函数的写法为:
d(形参列表):a(实参列表),b(实参列表),c(实参列表){
//其他操作
}
基类构造函数的调用顺序和和它们在html slider类构造函数中出现的顺序无关,而是和声明html slider类时基类出现的顺序相同。仍然以上面的a、b、c、d类为例,即使将d类构造函数写作下面的形式:
d(形参列表):b(实参列表),c(实参列表),a(实参列表){
//其他操作
}
那么也是先调用a类的构造函数,再调用b类构造函数,最后调用c类构造函数。
下面是一个多继承的实例:
#include <iostream>
using namespace std;
//基类
classbasea{
public:
basea(int a, int b);
~basea();
protected:
int m_a;
int m_b;
};
basea::basea(int a, int b): m_a(a), m_b(b){
cout<<basea constructor<<endl;
}
basea::~basea(){
cout<<basea destructor<<endl;
}
//基类
classhtml slider{
public:
html slider(int c, int d);
~html slider();
protected:
int m_c;
int m_d;
};
html slider::html slider(int c, int d): m_c(c), m_d(d){
cout<<html sliderconstructor<<endl;
}
html slider::~html slider(){
cout<<html sliderdestructor<<endl;
}
//html slider类
classhidden html: public basea, public html slider{
public:
hidden html(int a, int b, int c, int d, int e);
~hidden html();
public:
void show();
private:
int m_e;
};
hidden html::hidden html(int a, int b, int c, int d, int e): basea(a, b), html slider(c, d), m_e(e){
cout<<hidden htmlconstructor<<endl;
}
hidden html::~hidden html(){
cout<<hidden htmldestructor<<endl;
}
void hidden html::show(){
cout<<m_a<<, <<m_b<<, <<m_c<<, <<m_d<<, <<m_e<<endl;
}
int main(){
hidden htmlobj(1, 2, 3, 4, 5);
obj.show();
return 0;
}
运行结果:
basea constructor
html sliderconstructor
hidden htmlconstructor
1, 2, 3, 4, 5
hidden htmldestructor
html sliderdestructor
basea destructor
从运行结果中还可以发现,多继承形式下析构函数的执行顺序和构造函数的执行顺序相反。
命名冲突
当两个或多个基类中有同名的成员时,如果直接访问该成员,就会产生命名冲突,编译器不知道使用哪个基类的成员。这个时候需要在成员名字前面加上类名和域解析符::,以显式地指明到底使用哪个类的成员,消除二义性。
修改上面的代码,为 basea 和 html slider类添加 show() 函数,并将 hidden html类的 show() 函数更名为 display():
#include <iostream>
using namespace std;
//基类
classbasea{
public:
basea(int a, int b);
~basea();
public:
void show();
protected:
int m_a;
int m_b;
};
basea::basea(int a, int b): m_a(a), m_b(b){
cout<<basea constructor<<endl;
}
basea::~basea(){
cout<<basea destructor<<endl;
}
void basea::show(){
cout<<m_a = <<m_a<<endl;
cout<<m_b = <<m_b<<endl;
}
//基类
classhtml slider{
public:
html slider(int c, int d);
~html slider();
void show();
protected:
int m_c;
int m_d;
};
html slider::html slider(int c, int d): m_c(c), m_d(d){
cout<<html sliderconstructor<<endl;
}
html slider::~html slider(){
cout<<html sliderdestructor<<endl;
}
void html slider::show(){
cout<<m_c = <<m_c<<endl;
cout<<m_d = <<m_d<<endl;
}
//html slider类
classhidden html: public basea, public html slider{
public:
hidden html(int a, int b, int c, int d, int e);
~hidden html();
public:
void display();
private:
int m_e;
};
hidden html::hidden html(int a, int b, int c, int d, int e): basea(a, b), html slider(c, d), m_e(e){
cout<<hidden htmlconstructor<<endl;
}
hidden html::~hidden html(){
cout<<hidden htmldestructor<<endl;
}
void hidden html::display(){
basea::show(); //调用basea类的show()函数
html slider::show(); //调用html slider类的show()函数
cout<<m_e = <<m_e<<endl;
}
int main(){
hidden htmlobj(1, 2, 3, 4, 5);
obj.display();
return 0;
}
请读者注意第 61、62 行代码,我们显式的指明了要调用哪个基类的 show() 函数。
web前端代码的优化?企业怎么选择平台建设网站?建网站的详细步骤是怎样的,企业如何建立一个网站有哪些过程?建立高端网站有四大问题值得注意网站优化时如何提升网站关键词排名?搜索引擎缓存机制对SEO的重要性(如何利用搜索引擎缓存机制提升网站排名)公司建站后如何然让产品大卖域名选择与注册技巧