美文网首页
C++的多继承与虚继承

C++的多继承与虚继承

作者: 司马捷 | 来源:发表于2016-08-01 17:36 被阅读324次

    1.多继承的基本使用
    2.当一个派生类,从多个基类派生,而这些基类又有一个共同的基类,则对后面这个原始基类中声明的属性进行访问的时候,会产生二义性.因为这个类会在多继承过程中,多次构造.所以不知道访问的是哪一个属性.
    3.解决这种二义性,通过虚拟继承,virtual 关键字.

    //
    //  main.cpp
    //  C++多继承
    //
    //  Created by 扆佳梁 on 16/8/1.
    //  Copyright © 2016年 Eric. All rights reserved.
    //
    
    #include <iostream>
    using namespace std;
    
    
    class Base1
    {
    public:
        Base1(int x){
            value = x;
        }
        int getData()const{
            
            return value;
        }
    protected:
        int value;
    };
    
    class Base2{
    public:
        Base2(char c){
            letter = c;
        }
        char getData()const{
            return letter;
        }
        char letter;
    };
    
    class Derived:public Base1,public Base2{
        
    private:
        double real;
        friend ostream &operator<<(ostream &,const Derived der);
    public:
        Derived(int ,char ,double);
        double getReal()const;
    };
    
    class B{
    public:
        B(){
            cout<<"构造方法---"<<endl;
        }
    public:
        int b = 0;
    };
    
    //class B1 : public B{
        
    //private:
    //    int b1;
    //};
    
    //class B2:public B{
    //private:
    //    int b2;
    //};
    
    /**
     *  ¬   C++提供虚继承机制,防止类继承关系中成员访问的二义性。
     ¬   多继承提供了软件重用的强大功能,也增加了程序的复杂性。
    
     */
    class B1 : virtual public B{
    public:
        B1(){
           cout<<"B1构造方法---"<<endl;
        }
    private:
        int b1;
    };
    
    class B2: virtual public B{
    public:
        B2(){
          cout<<"B2构造方法---"<<endl;
        }
    private:
        int b2;
    };
    
    
    class C :public B1,public B2{
    public:
        int f();
    private:
        int d;
    };
    
    int main(int argc, const char * argv[]) {
        // insert code here...
        std::cout << "Hello, World!\n";
        
       // C c;
    //    c.B1::b = 10;
     //   c.B::b = 20;//不知道 这个C 是从哪里继承来的
        // 建立C类对象时,B的构造函数将被调用两次:一次由B1调用,另一次由B2调用,用来初始化C类对象中所有包含的两个B
        //类的子对象.
        
        
        C cc;
       // cc.b = 10;
        
        
        
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C++的多继承与虚继承

          本文链接:https://www.haomeiwen.com/subject/qktfsttx.html