zoukankan      html  css  js  c++  java
  • C++虚继承

    C++中支持多重继承,但是菱形继承会带来一些问题。

    比如D1和D2继承了B,而D又同时继承了D1和D2

     1 class B{
     2     public:
     3     int x;
     4 };
     5 
     6 class D1:public B{
     7 };
     8 
     9 class D2:public B{
    10 };
    11 
    12 class D:public D1, public D2{
    13 };

    如果初始化一个D的对象,访问x就会产生歧义,因为D里面包含D1和D2的成员,而D1和D2各自有一份继承自B的x,编译器此时不知道该访问哪个x。

    而虚继承能够保证菱形继承中,父类B的成员只出现一次,避免这种歧义。

    1 class D1:virtual public B{
    2 };
    3 
    4 class D2:public virtual B{
    5 };

    注意:上面代码中第1行和第4行的两种写法都是可以的。

    虚继承关键字写在D1和D2的继承列表上,但却对D1和D2没有影响,而是影响继承D1和D2的D。

    但是虚继承也无法解决所有的歧义,比如:

     1 class B{
     2     public:
     3         int x;
     4 };
     5 
     6 class D1:virtual public B{
     7     public:
     8         int x;
     9 };
    10 
    11 class D2:public virtual B{
    12     public:
    13         int x;
    14 };
    15 
    16 class D:public D1, public D2{
    17 };

    在这种情况下,即使使用了虚继承,创建D的对象访问x的时候仍然会发生歧义。

  • 相关阅读:
    SPOJ 149 FSHEEP Fencing in the Sheep ( 计算几何 + 二分 )
    UVa 11806
    UVa 1445
    HDU 4725 The Shortest Path in Nya Graph( 建图 + 最短路 )
    HDU 4661 Message Passing ( 树DP + 推公式 )
    从远程库克隆库
    添加远程库
    远程仓库
    删除文件
    撤销修改
  • 原文地址:https://www.cnblogs.com/richardustc/p/3034039.html
Copyright © 2011-2022 走看看