C++的多继承与虚继承

2016-08-01  本文已影响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;
}
上一篇下一篇

猜你喜欢

热点阅读