C++面向对象入门(二十八)二义性和支配规则

C++继承中的二义性:
1 一个派生类A继承自多个具有某些同名成员a,b,c的基类B,C,..., 访问这些成员导致的二义性
解决方法:
1 在访问时加上基类名加作用域符
2 在派生类中重新定义自己的该成员
2 一个派生类A继承自多个基类B,C,..., 这些基类又是同一基类D的派生类, 在派生类A中访问继承自B,C的成员a,b,...c导致的二义性
解决方法:
1 在访问时加上基类名加作用域符
2 在派生类中重新定义自己的该成员
二义性检查在访问权限检查之前, 故不能通过访问权限控制来避免程序二义性
由于程序的二义性, 一个类不能直接继承一个类多次, 但是可以使用间接基类来实现
支配规则:
类X以类Y作为其基类, 类X中的名字N支配类Y中的变量N
 
 
代码示例:
#include <iostream>
using namespace std;

/*
C++继承中的二义性:
1 一个派生类A继承自多个具有某些同名成员a,b,c的基类B,C,..., 访问这些成员导致的二义性
解决方法:
1 在访问时加上基类名加作用域符
2 在派生类中重新定义自己的该成员
2 一个派生类A继承自多个基类B,C,..., 这些基类又是同一基类D的派生类, 在派生类A中访问继承自B,C的成员a,b,...c导致的二义性
解决方法:
1 在访问时加上基类名加作用域符
2 在派生类中重新定义自己的该成员

二义性检查在访问权限检查之前, 故不能通过访问权限控制来避免程序二义性
由于程序的二义性, 一个类不能直接继承一个类多次, 但是可以使用间接基类来实现

支配规则:
类X以类Y作为其基类, 类X中的名字N支配类Y中的变量N
*/
class A45
{
public:
    A45();
    A45(int);
    int a;
};

class B45:public A45
{
public:
    B45();
    int b;
        
};

class C45: public A45 
{
public:
    C45();
    int b;
};

class D45 :public B45, public C45{
public:
    D45();
    void test1();
    void test2();
};

int main()
{
    D45 d;
    d.test1();
    d.test2();
    system("pause");
}

A45::A45():a(1)
{
}

A45::A45(int a):a(a)
{
}

B45::B45() : A45(1),b(1)
{
}

C45::C45():A45(2),b(2)
{
}

D45::D45():B45(),C45()
{
}

void D45::test1()
{
    //cout << "b = " << b << endl;
    //D45::b不明确
    cout << "B45::b = " << B45::b << endl;
    cout << "C45::b = " << C45::b << endl;
}

void D45::test2()
{
    //cout << "a = " << a << endl;
    //D45::a不明确
    cout << "B45::a = " << B45::a << endl;
    cout << "C45::a = " << C45::a << endl;
}
#include <iostream>
using namespace std;

/*
C++继承中的二义性:
1 一个派生类A继承自多个具有某些同名成员a,b,c的基类B,C,..., 访问这些成员导致的二义性
解决方法:
1 在访问时加上基类名加作用域符
2 在派生类中重新定义自己的该成员
2 一个派生类A继承自多个基类B,C,..., 这些基类又是同一基类D的派生类, 在派生类A中访问继承自B,C的成员a,b,...c导致的二义性
解决方法:
1 在访问时加上基类名加作用域符
2 在派生类中重新定义自己的该成员

二义性检查在访问权限检查之前, 故不能通过访问权限控制来避免程序二义性
由于程序的二义性, 一个类不能直接继承一个类多次, 但是可以使用间接基类来实现

支配规则:
类X以类Y作为其基类, 类X中的名字N支配类Y中的变量N
*/
class A45
{
public:
    A45();
    A45(int);
    int a;
};

class B45:public A45
{
public:
    B45();
    int b;
        
};

class C45: public A45 
{
public:
    C45();
    int b;
};

class D45 :public B45, public C45{
public:
    D45();
    void test1();
    void test2();
};

int main()
{
    D45 d;
    d.test1();
    d.test2();
    system("pause");
}

A45::A45():a(1)
{
}

A45::A45(int a):a(a)
{
}

B45::B45() : A45(1),b(1)
{
}

C45::C45():A45(2),b(2)
{
}

D45::D45():B45(),C45()
{
}

void D45::test1()
{
    //cout << "b = " << b << endl;
    //D45::b不明确
    cout << "B45::b = " << B45::b << endl;
    cout << "C45::b = " << C45::b << endl;
}

void D45::test2()
{
    //cout << "a = " << a << endl;
    //D45::a不明确
    cout << "B45::a = " << B45::a << endl;
    cout << "C45::a = " << C45::a << endl;
}

 

posted @ 2020-08-31 21:37  DNoSay  阅读(613)  评论(0编辑  收藏  举报