cpp——类——多重继承——作用域 名字查找

多重继承对象名字查找

直接父类继承自不同父类

class CDAnimal
{
public:
    CDAnimal() : mGroup(1) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CDAnimal::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CDAnimal::getTotalGroup()" << endl; return totalGroup; }
};

int CDAnimal::totalGroup = 5;

class CHAnimal
{
public:
    CHAnimal() : mGroup(1) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CHAnimal::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CHAnimal::getTotalGroup()" << endl; return totalGroup; }
};

int CHAnimal::totalGroup = 5;

class CDonkey : public CDAnimal
{
public:
    CDonkey() : mGroup(2) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CDonkey::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CDonkey::getTotalGroup()" << endl; return totalGroup; }
};

int CDonkey::totalGroup = 8;

class CHorse : public CHAnimal
{
public:
    CHorse() : mGroup(3) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CHorse::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CHorse::getTotalGroup()" << endl; return totalGroup; }
};

int CHorse::totalGroup = 18;

class CMule : public CDonkey, public CHorse
{
public:
    CMule() : mGroup(4) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CMule::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CMule::getTotalGroup()" << endl; return totalGroup; }
    
public:
    void search()
    {
        cout << "mGroup = " << mGroup << endl;
        init();
        cout << "totalGroup = " << totalGroup << endl;
        getTotalGroup();
    }
};

int CMule::totalGroup = 58;

void search_obj_name()
{
    CMule mule;
    mule.search();
}
output:
mGroup = 4
CMule::init()
totalGroup = 58
CMule::getTotalGroup()
删除CMule除search外所有成员
class CDAnimal
{
public:
    CDAnimal() : mGroup(1) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CDAnimal::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CDAnimal::getTotalGroup()" << endl; return totalGroup; }
};

int CDAnimal::totalGroup = 5;

class CHAnimal
{
public:
    CHAnimal() : mGroup(1) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CHAnimal::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CHAnimal::getTotalGroup()" << endl; return totalGroup; }
};

int CHAnimal::totalGroup = 5;

class CDonkey : public CDAnimal
{
public:
    CDonkey() : mGroup(2) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CDonkey::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CDonkey::getTotalGroup()" << endl; return totalGroup; }
};

int CDonkey::totalGroup = 8;

class CHorse : public CHAnimal
{
public:
    CHorse() : mGroup(3) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CHorse::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CHorse::getTotalGroup()" << endl; return totalGroup; }
};

int CHorse::totalGroup = 18;

class CMule : public CDonkey, public CHorse
{
public:
    void search()
    {
        cout << "mGroup = " << mGroup << endl;
        init();
        cout << "totalGroup = " << totalGroup << endl;
        getTotalGroup();
    }
};

void search_obj_name()
{
    CMule mule;
    mule.search();
}
编译error,二义性错误
多重继承类(CMule)作用域嵌套关系:
CDAnimal
{
    CDonkey
    {
        CMule
        {
        }
    }
}

CHAnimal
{
    CHorse
    {
        CMule
        {
        }
    }
}

直接父类继承自同一父类

class CAnimal
{
public:
    CAnimal() : mGroup(1) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CAnimal::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CAnimal::getTotalGroup()" << endl; return totalGroup; }
};

int CAnimal::totalGroup = 5;

class CDonkey : public CAnimal
{
public:
    CDonkey() : mGroup(2) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CDonkey::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CDonkey::getTotalGroup()" << endl; return totalGroup; }
};

int CDonkey::totalGroup = 8;

class CHorse : public CAnimal
{
public:
    CHorse() : mGroup(3) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CHorse::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CHorse::getTotalGroup()" << endl; return totalGroup; }
};

int CHorse::totalGroup = 18;

class CMule : public CDonkey, public CHorse
{
public:
    CMule() : mGroup(4) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CMule::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CMule::getTotalGroup()" << endl; return totalGroup; }
    
public:
    void search()
    {
        cout << "mGroup = " << mGroup << endl;
        init();
        cout << "totalGroup = " << totalGroup << endl;
        getTotalGroup();
    }
};

int CMule::totalGroup = 58;

void search_obj_name()
{
    CMule mule;
    mule.search();
}
output:
mGroup = 4
CMule::init()
totalGroup = 58
CMule::getTotalGroup()
删除CMule除search外所有成员
class CAnimal
{
public:
    CAnimal() : mGroup(1) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CAnimal::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CAnimal::getTotalGroup()" << endl; return totalGroup; }
};

int CAnimal::totalGroup = 5;

class CDonkey : public CAnimal
{
public:
    CDonkey() : mGroup(2) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CDonkey::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CDonkey::getTotalGroup()" << endl; return totalGroup; }
};

int CDonkey::totalGroup = 8;

class CHorse : public CAnimal
{
public:
    CHorse() : mGroup(3) {}
    
public:
    int mGroup;
    
public:
    void init() { cout << "CHorse::init()" << endl; }
    
public:
    static int totalGroup;
    
public:
    static int getTotalGroup() { cout << "CHorse::getTotalGroup()" << endl; return totalGroup; }
};

int CHorse::totalGroup = 18;

class CMule : public CDonkey, public CHorse
{
public:
    void search()
    {
        cout << "mGroup = " << mGroup << endl;
        init();
        cout << "totalGroup = " << totalGroup << endl;
        getTotalGroup();
    }
};

void search_obj_name()
{
    CMule mule;
    mule.search();
}
编译error,二义性错误
多重继承类(CMule)作用域嵌套关系:
CAnimal
{
    CDonkey
    {
        CMule
        {
        }
    }
}

CAnimal
{
    CHorse
    {
        CMule
        {
        }
    }
}

总结

  • 子类作用域与父类作用域形成嵌套,子类作用域内嵌于父类作用域,但多重继承类的多个父类之间并无继承关系,因此多重继承类的多个父类作用域无嵌套且并行
  • CMule类作用域内嵌于CDonkey类作用域和CHorse类作用域,CDonkey类作用域和CHorse类作用域内嵌于各自父类作用域(第一个例子各自父类作用域为CDAnimal类作用域和CHAnimal类作用域,第二个例子各自父类作用域为CAnimal类作用域和CAnimal类作用域),但CDonkey类作用域和CHorse类作用域无嵌套且并行,在CMule类作用域中查找对象名字时先在CMule类作用域中查找,如果not found,接着从CDonkey类作用域和CHorse类作用域并行查找(无先后顺序),CDonkey类作用域和CHorse类作用域不属于同一作用域,因此它们之间重名对象名字(函数对象名字)不会形成重载,因此在并行查找对象名字过程中不同类作用域中对象名字不会进行类型匹配精确度比较,如果在多个并行类作用域中都查到对象名字就形成二义性错误,编译error
注:为避免二义性error,可在多重继承类作用域内override,明确使用多重继承类作用域内对象,或使用类作用域操作符明确使用哪个父类作用域内对象

类型名字查找

类作用域内也可定义类型,称为嵌套类型,类作用域内类型名字查找遵循对象名字查找相同原理和过程,不再赘述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值