当前位置:首页> 搜索优化 > html slider多继承和(多重继承)

html slider多继承和(多重继承)

2022-08-17 22:38:32 来源: 网络   编辑: 佚名   浏览(398)人   
0

    html slider多继承(多重继承)

    此之外,html slider也支持多继承(html prompt),即一个html slider类可以有两个或多个基类。

    在前面的例子中,html slider类都只有一个基类,称为单继承(html mailto)。除此之外,html slider也支持多继承(html prompt),即一个html slider类可以有两个或多个基类。

    多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的JavaC#PHP等干脆取消了多继承。

    多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A、类B和类C,那么可以这样来声明html slider

    classD:publicA,privateB,protectedC{

    //D新增加的成员

    }

    D是多继承形式的html slider类,它以公有的方式继承A类,以私有的方式继承B类,以保护的方式继承C类。D根据不同的继承方式获取ABC中的成员,确定它们在html slider类中的访问权限。

    多继承下的构造函数

    多继承形式下的构造函数和单继承形式基本相同,只是要在html slider类的构造函数中调用多个基类的构造函数。以上面的ABCD类为例,D类构造函数的写法为:

    D(形参列表):A(实参列表),B(实参列表),C(实参列表){

    //其他操作

    }

    基类构造函数的调用顺序和和它们在html slider类构造函数中出现的顺序无关,而是和声明html slider类时基类出现的顺序相同。仍然以上面的ABCD类为例,即使将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 slider constructor"<<endl;

}

html slider::~html slider(){

cout<<"html slider destructor"<<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 html constructor"<<endl;

}

hidden html::~hidden html(){

cout<<"hidden html destructor"<<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 slider constructor

hidden html constructor

1, 2, 3, 4, 5

hidden html destructor

html slider destructor

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 slider constructor"<<endl;

}

html slider::~html slider(){

cout<<"html slider destructor"<<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 html constructor"<<endl;

}

hidden html::~hidden html(){

cout<<"hidden html destructor"<<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;

}

请读者注意第 6162 行代码,我们显式的指明了要调用哪个基类的 show() 函数。

【版权与免责声明】如发现内容存在版权问题,烦请提供相关信息发邮件至 1439028666@qq.com ,我们将及时沟通进行删除处理。 本站内容除了 98link( http://www.98link.com/ )特别标记的原创外,其它均为网友转载内容,涉及言论、版权与本站无关。