多继承的派生类的构造函数如何编写

来源:百度知道 编辑:UC知道 时间:2024/06/01 01:36:40
class gf()
{
public:
gf(int A){a=A;}
private:
int a;
}

class f1:public gf
{
public:
f1(int A,int B):gf(A){b=B;}
private:
int b;
}

class f2:public gf
{
public:
f2(int A,int C):gf(A){c=C;}
private:
int c;
}

class s:public f1,public f2
{
public:
.......
private:
int d;
}

类gf派生出类f1和f2;而f1和f2又是类s的基类;由于f1和f2都具有相同的数据成员a,请问派生类s的构造函数该如何编写(即.....部分)?

在s中的构造函数里,你只能调用f1和f2的构造函数,也就是说,你只能调用你的类的“直接基类”的构造函数,不能调用更上一层的构造函数。写成;
class s:public f1,public f2
{
public:
s(int a,int b,int c):f1(a,b),f2(a,c){}
}
如果要显式地引用f1中的数据成员a,就要加上作用域,如下:
s(int a,int b,int c)
{
f1::a=a;
f2::a=a;
b=b;
c=c;

}但是,看上去,派生类s对它的基类的几个成员都没有访问权限,因为无论是a还是b、c,都是私有的,所以上面的写法编译不过去,但是作用域规则是正确的,也是说,如果a、b、c的访问权限中公有的话,那么上面的代码是能正常工作的。