1.派生函数的作用域
形式为:基类名::成员名;基类名::成员名(参数表);
如果某派生类的多个基类拥有同名的成员,同时,派生类又新增这样的同名成员,在这种情况下,派生类成员将覆盖所有基类的同名成员。这就需要这样的调用方式才能调用基类的同名成员。
例子
#include #include using namespace std; class B1 { public: int nV; void fun() { cout << "member of B1 " << nV << endl; } }; class B2 { public: int nV; void fun() { cout << "member of B2 " << nV << endl; } }; class D1 : public B1, public B2 { public: int nV; void fun() { cout << "member of D1 " << nV << endl; } }; int main() { D1 d1; d1.nV = 1; d1.fun(); d1.B1::nV = 2; d1.B1::fun(); d1.B2::nV = 3; d1.B2::fun(); // return 0; system("pause"); }
2.虚基类
我们可以将共同基类设置为虚基类,这时从不同路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数也只有一个映射,减少了内存的开销。
虚基类的声明是在派生类的声明过程,其语法形式为:
class 派生类名::virtual 继承方式 基类名;
#include #include using namespace std; class B0 { public: int nV; void fun() { cout<<"member of B0 "< < 输出结果为: member of B0 2 3.虚基类及其派生类的构造函数
一般而言,派生类只对其直接基类的构造函数传递参数,但是在虚基类中,不管是直接或间接虚基类的所有派生类,都必须在构造函数的成员初始化 列表中列出对虚基类的初始化。
#include #include using namespace std; class B0 { public: B0(int n) { nV = n; } int nV; void fun() { cout << "member of B0 " << nV << endl; } }; class B1 :virtual public B0 { public: B1(int a) :B0(a) { } int nV1; }; class B2 :virtual public B0 { public: B2(int a) :B0(a) { } int nV2; }; class D1 :public B1, public B2 { public: D1(int a) :B0(a), B1(a), B2(a) { } int nVd; void fund() { cout << "member of D1" << endl; } }; int main() { D1 d1(1); d1.fun(); d1.B1::fun(); d1.B2::fun(); d1.nV = 2; d1.fun(); system("pause"); } 以上例子看上去B0的构造函数好像被调用了三次,但是实际上只有D1类中的D1(int a):B0(a), B1(a), B2(a) 才是真正的调用了B0构造函数。