C++ (P160—)多继承 二义性 虚基类 “向上转型”

1 多继承中,必须给每个基类指定一种派生类型,如果缺省,相应的基类则取私有派生类型,而不是和前一个基类取相同的派生类型

2 一个类的保护成员只能被本类的成员函数或者它的派生类成员函数访问

3 由于c++中不允许对类成员进行初始化,但是在编程时需要用特定的值去初始化派生类的对象,这时需要通过为派生类定义一个带有初始化列表的构造函数来实现。

class D:public B,private A,public C
{
   public:
      D(){..................}
      D(int a,int b,int c,int d,int e,int f,int g):A(a,b),a(d,e),b(f),B(c),w(g)
           {..................}
   ..........
   private:
      C c;
      A a;
      B b;//只能这样进行定义类成员变量
      int w;
};

int main ()
{
      D  d1;
      D  d2(1,2,3,4,5,6,7);
      return 0;
}

4 多继承造成的二义性:若派生类中的成员函数与其基类成员重名的现象,派生类中的成员函数将覆盖所有基类中的同名成员。但是如果只是基类与基类之间的成员重名,

  需要使用作用域运算符“::”来限定:

    

d.A::a=1;
d.B::fun();

注意两点:a. 需要采用派生类的直接基类名来限定,而不是需要访问的成员所在类的类名。

     b. 二义性是在访问控制权限和类型检查之前进行的,因此制定不同的访问控制权限和类型并不能解决二义性问题。

5 在多继承中的虚基类的作用:以虚基类的形式继承,只建立公共基类的一个副本,这样就不存在二义性

    注意点:c++规定,对于继承过程中的虚基类,它们由最后派生出来的用于声明对象的类来初始化,而对于派生类的基类中对这个虚基类的初始化都被忽略。

class 派生类名:virtual 派生类型 基类名

6 “向上转型”

   区别于java,c++有三种情况的向上赋值

 (1)用派生类的对象给积累的对象赋值,赋值的结果是将派生类对象中的所含积累成员的值赋给基类对象中相同的成员

 (2)可以用派生类的对象初始化基类的引用

 (3)可以用派生类对象的地址给积累对象的指针赋值。

   23中方法中的基类的引用和指针只能用来访问派生类对象中从基类继承下来的成员,若想访问派生类中新增成员需要进行强制转换。

#include <iostream>
#include <string>

using namespace std;
class A
{
public:
    void funa(){cout<<"调用的A"<<a<<endl;}
    int a;
};
class C:public A
{
public:
    void func(){cout<<"调用的C"<<c<<endl;}
    int c;
};

int main()
{
    
    C c;
    c.a=1;
    c.c=2;
    A &a = c;
    A *aa = &c;
    A aaa = c;
    a.funa();
    ((C&)a).func();
    ((C*)aa)->func();
    ((C)aaa).func();//error
        aaa.func();//error
    return 0;
}

 

posted @ 2016-03-08 10:44  小德cyj  阅读(691)  评论(0编辑  收藏  举报