~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:VS2015与 C++
撰写时间:2019/06/27
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
重命名成员:
派生类定义了基类同名的成员,在派生类中访问同名成员时屏蔽了基类成员的同名成员。
在派生类中使用基类的同名成员,显示地使用类名限定符 ::
类名 :: 成员
例:class A{A(){i = 1;} int i;};
class B:public A{B(){i=2;} int i};
void main(){B b;cout << “b中的i:” << b.i << endl;cout << “A中的i:” << b.A::b << endl;}
基类的作用域延申到所有派生类,派生类同名成员屏蔽基类的同名成员。
重名成员函数:通过继承,类B具有两个同名的成员函数。
class A{public:int a;void print(){cout << “a = ” << a << endl;}};
class B:public A{public:int b;void print(){cout << “b = ” << b << endl;}};
void main(){B b;b.print();b.A::print();}
派生类中定义与基类同名的函数称为重载函数成员。
派生类中的静态成员:
基类定义的静态成员,将被所有派生类共享;
根据静态成员自身的访问特性和派生类的继承方式,在层次体系中具有不同的访问性质;
派生类中访问静态成员:类名::成员 或者通过对象访问 对象名.成员
例:class A{public: static int i ;static void add(){i++;}};int A::i = 0;
class B:public A{public:void print(){cout << i << endl;}};
void main(){B b;cout << b.i << endl; cout << B::i << endl;}
基类的初始化:
建立一个类层次后,通常创建某个派生类的对象,包括使用基类的数据和函数。
C++提供一种机制,在创建派生类对象时用指定的参数调用基类的构造函数来初始化派生类继承基类的数据。
派生类构造函数声明为:
派生类构造函数 (变元表):基类(变元表),对象成员1(变元表)…对象成员n(变元表);
构造函数执行顺序:基类->对象成员->派生类
多继承:
1.多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员。
2.执行顺序与单继承构造函数情况类似。多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。
3.一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别。
例:
class A{public: A() { cout << "A" << endl; }};
class C{ public: C(){cout << "C" << endl;}};
class B:public A,public C
{public:
B() { cout << "B" << endl; }};
void main(){ B b;}
虚基类:
如果一个派生类从多个基类诞生,而这些基类又有一个共同的基类,则对该基类中声明的名字进行访问时,可能产生二义性。
class A
{public: A() { cout << "A" << endl; } void setint() {};};
class C:public A
{public: C() { cout << "C" << endl; }};
class E :public A
{public: E() { cout << "E" << endl; }};
class D:public C,public E
{public: D() { cout << "D" << endl; }};
void main(){ D d; d.setint();}
临时解决办法:
虚基类:虚继承关键字: virtual
例如:使用virtual修饰后,B和C都继承同一个A
class A{public:int a;};
class B:virtual public A{private:int b;}
class C:virtual public A{private:int c;}
class D:public B, public C {private:int d;}
C++提供虚继承机制,防止类继承关系中成员访问的二义性。