class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
class C: public A, public B
{
public:
};
其中,<继承方式1>,<继承方式2>,…是三种继承方式:public、private、protected之一。
在多继承的情况下,派生类的构造函数格式如下:
<派生类名>(<总参数表>):<基类名1>(<参数表1>),<基类名2>(<参数表2>),…
<子对象名>(<参数表n+1>),…
{
<派生类构造函数体>
}
其中,<总参数表>中各个参数包含了其后的各个分参数表。
1.先执行所属基类的构造函数
2.再执行派生类本身构造函数
注:执行基类构造函数的顺序取决于定义派生类时基类的顺序
//代码1(代码1和代码2对比)
#include<iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A's constructor"<<endl;
}
};
class B
{
public:
B()
{
cout<<"B's constructor"<<endl;
}
};
class C: public A, public B//先A后B
{
public:
C()
{
cout<<"C's constructor"<<endl;
}
};
int main()
{
C c;
return 0;
}
//输出"A's constructor"然后是"B's constructor"最后是"C's constructor"
//代码2
#include<iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A's constructor"<<endl;
}
};
class B
{
public:
B()
{
cout<<"B's constructor"<<endl;
}
};
class C: public B, public A//先B后A
{
public:
C()
{
cout<<"C's constructor"<<endl;
}
};
int main()
{
C c;
return 0;
}
//先输出"B's constructor"再输出"A's constructor"最后输出"C's constructor"
#include<iostream>
using namespace std;
class A
{
int a;
public:
A(int x)
{
a=x;
cout<<"A's constructor"<<endl;
}
int geta()
{
return a;
}
};
class B
{
int b;
public: B(int y)
{
b=y;
cout<<"B's constructor"<<endl;
}
int getb()
{
return b;
}
};
class C: public A, public B
{
int c;
public:C(int x,int y,int z):B(x),A(y)
{
z=c;
cout<<"C's constructor"<<endl;
}
};
int main()
{
C c(1,2,3);
A a1(5);
cout<<c.geta()<<endl<<c.getb()<<endl;
cout<<a1.geta()<<endl;
cout<<c.geta();
return 0;
}
//错误代码举例:
#include <iostream>
using namespace std;
class A
{
public:
void show()
{
cout<<"This is A";
}
};
class B
{
public:
void show()
{
cout<<"This is B";
}
};
class Son:public A,public B
{
public:
void display()
{
cout<<"This is son\n";
}
};
int main()
{
Son son;
son.show();//错误,因为不知道访问类A中的show(),还是访问类B中的show()
son.display();
cout << "Hello world!" << endl;
return 0;
}
son.show() ===> son.A::show()或者son.B::show()
//正确代码举例:son.A::show()
#include <iostream>
using namespace std;
class A
{
public:
void show()
{
cout<<"This is A"<<endl;
}
};
class B
{
public:
void show()
{
cout<<"This is B"<<endl;
}
};
class Son:public A,public B
{
public:
void display()
{
cout<<"This is son"<<endl;
}
};
int main()
{
Son son;
son.A::show();
son.display();
cout << "Hello world!" << endl;
return 0;
}
//正确代码举例:
#include <iostream>
using namespace std;
class A
{
public:
void show()
{
cout<<"This is A"<<endl;
}
};
class B
{
public:
void show()
{
cout<<"This is B"<<endl;
}
};
class Son:public A,public B
{
public:
void display()
{
cout<<"This is son"<<endl;
}
void show()
{
cout<<"show::This is son"<<endl;
}
};
int main()
{
Son son;
son.show();//此时son.show()将调用son.Son::show()
son.display();
cout << "Hello world!" << endl;
return 0;
}
//错误代码
#include <iostream>
using namespace std;
class A
{
public:
int m;
};
class B:public A {};
class C:public A {};
class D:public B,public C {};
int main()
{
D d;
d.m= 10;//错误,因为不知道调用B的m还是C的m
cout << "Hello world!" << endl;
return 0;
}
d.m= 10 ====> d.B::m= 10或者d.C::m= 10
#include <iostream>
using namespace std;
class A
{
public:
int m;
};
class B:public A {};
class C:public A {};
class D:public B,public C {};
int main()
{
D d;
d.B::m= 10;
cout << "Hello world!" << endl;
return 0;
}
class A
{
public:
int m;
};
class B:public A {};
class C:public A {};
class D:public B,public C
{
public:
int m;
};
//正确代码举例
#include <iostream>
using namespace std;
class A
{
public:
int m;
};
class B:public A {};
class C:public A {};
class D:public B,public C
{
public:
int m;
};
int main()
{
D d;
d.m= 10;//此处相当于访问的D的m
cout<<d.D::m<<endl;
cout<<"Hello world!"<<endl;
return 0;
}
#include <iostream>
using namespace std;
class A
{
public:
int m;
};
class B:virtual public A {};
class C:virtual public A {};
class D:public B,public C
{
public:
int m;
};
int main()
{
D d;
d.m= 10;
cout<<"Hello world!"<<endl;
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务