一、虚基类:
把某一个类作为虚基类来继承的一系列派生类,只继承了该基类中的数据成员一次。假如基类base有数据成员int a,那么以base为虚基类的派生类中,a是共享的。
当派生类中有虚基类和普通基类时,先调用虚基类的构造函数,后调用普通基类的构造函数,若有多个虚基类,则按照声明顺序调用。
当派生类建立对象时,若它的几个基类都有一个一样的虚基类,那么这个派生类的构造函数在定义时必须调用该虚基类的构造函数,且当对象建立起来并初始化时,由该最终派生类对虚基类的构造函数进行调用,其他虚基类的派生类对虚基类构造函数的调用将被忽略。
二、基类与派生类的赋值兼容关系:
记住一句口诀,所有用到基类对象的地方都可以用派生类对象来代替。
如:可以用派生类对象来初始化基类对象或基类对象的引用;把派生类对象地址赋予指向基类对象的指针;如果函数形参是基类对象,可以用派生类对象当实参。
示例代码:
#include#include using namespace std; class base { public: base(int sa) { a = sa; cout << "constructing base" << endl; } void show() { cout << "base:a=" << a << endl; } protected: int a; }; class base1 :virtual public base { public: base1(int sa, int sb); protected: int b; }; base1::base1(int sa, int sb) :base(sa) { b = sb; cout << "constructing base1" << endl; } class base2 :public virtual base { protected: int c; public: base2(int sa, int sc); }; base2::base2(int sa, int sc) :base(sa) { c = sc; cout << "constructing base2" << endl; } class base3 :public base { protected: int d; public: base3(int sa, int sd) :base(sa) { d = sd; cout << "constructing base3" << endl; } void show3() { cout << "base3的对象中:a=" << a << " d=" << d << endl; } }; class Derived :public base1, public base2 { private: int e; public: Derived(int sa, int sb, int sc, int se); void showD() { cout << "Derived的对象中:a=" << a << " b=" << b<< " c=" < show(); }
运行结果:
constructing base constructing base1 constructing base2 constructing Derived constructing base constructing base3 Derived的对象中:a=1 b=2 c=3 e=4 base3的对象中:a=5 d=6 base:a=1 base:a=1 base:a=1
从运行结果可以看出构造函数的运行顺序以及基类与派生类的赋值兼容关系成立。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)