cpp——多重继承——对象名字查找

来源:互联网 发布:windows是基于dos吗 编辑:程序博客网 时间:2024/04/29 10:12

多父类继承自不同父类

class CAnimal1{public:    void doWork(char) { cout << "CAnimal1::doWork(char)" << endl; }    public:    char work;};class CAnimal2{public:    void doWork(int) { cout << "CAnimal2::doWork(int)" << endl; }    public:    int work;};class CDonkey : public CAnimal1{public:    void doWork(long) { cout << "CDonkey::doWork(long)" << endl; }    public:    long work;};class CHorse : public CAnimal2{public:    void doWork(double) { cout << "CHorse::doWork(double)" << endl; }    public:    double work;};class CMule : public CDonkey, public CHorse{public:    void search()    {        char cWork = 'a';        int iWork = 3;        long lWork = 5L;        double dWork = 8.0;                //doWork(cWork);        //doWork(iWork);        //doWork(lWork);        //doWork(dWork);                //work = cWork;        //work = iWork;        //work = lWork;        //work = dWork;                CAnimal1::doWork(cWork);        CAnimal2::doWork(iWork);        CDonkey::doWork(lWork);        CHorse::doWork(dWork);                CAnimal1::work = cWork;        CAnimal2::work = iWork;        CDonkey::work = lWork;        CHorse::work = dWork;                cout << "CAnimal1::work = " << CAnimal1::work << endl;        cout << "CAnimal2::work = " << CAnimal2::work << endl;        cout << "CDonkey::work = " << CDonkey::work << endl;        cout << "CHorse::work = " << CHorse::work << endl;    }};
output:
CAnimal1::doWork(char)CAnimal2::doWork(int)CDonkey::doWork(long)CHorse::doWork(double)CAnimal1::work = aCAnimal2::work = 3CDonkey::work = 5CHorse::work = 8
多重继承类作用域嵌套:
CAnimal1{    CDonkey    {        CMule        {        }    }}CAnimal2{    CHorse    {        CMule        {        }    }}

多父类继承自同一父类

class CAnimal{public:    void doWork(int) { cout << "CAnimal::doWork(int)" << endl; }    public:    int work;};class CDonkey : public CAnimal{public:    void doWork(long) { cout << "CDonkey::doWork(long)" << endl; }    public:    long work;};class CHorse : public CAnimal{public:    void doWork(double) { cout << "CHorse::doWork(double)" << endl; }    public:    double work;};class CMule : public CDonkey, public CHorse{public:    void search()    {        int iWork = 3;        long lWork = 5L;        double dWork = 8.0;                //doWork(iWork);        //doWork(lWork);        //doWork(dWork);                //work = iWork;        //work = lWork;        //work = dWork;                //CAnimal::doWork(iWork);        CDonkey::doWork(lWork);        CHorse::doWork(dWork);                //CAnimal::work = iWork;        CDonkey::work = lWork;        CHorse::work = dWork;                cout << "CDonkey::work = " << CDonkey::work << endl;        cout << "CHorse::work = " << CHorse::work << endl;    }};
output:
CDonkey::doWork(long)CHorse::doWork(double)CDonkey::work = 5CHorse::work = 8
多重继承类作用域嵌套:
CAnimal{    CDonkey    {        CMule        {        }    }}CAnimal{    CHorse    {        CMule        {        }    }}

总结

  • 子类与父类的类作用域嵌套,子类作用域内嵌于父类作用域,但子类的父类们之间并无继承关系,因此在类作用域上是并行的,无嵌套,CMule类作用域分别内嵌于CDonkey和CHorse类作用域,CDonkey和CHorse类作用域分别内嵌于CAnimal类作用域,但CDonkey和CHorse类作用域并行无嵌套,而且也无先后顺序,在CMule类作用域中查找对象名字时先在CMule类作用域中查找,如果not found,接下来从CDonkey和CHorse类作用域并行查找,CDonkey和CHorse类作用域不是属于同一作用域,因此它们之间重名的函数对象名字不会形成函数重载,因此在并行查找对象名字过程中不同类作用域中的名字不会进行类型匹配精确度比较,如果在多个并行类作用域中分别查到名字就形成二义性错误,编译error
注:为避免二义性错误,解决方法可在子类作用域override,明确引用直接或间接父类作用域内的对象名字
0 0
原创粉丝点击