C++面向对象入门(二十八)二义性和支配规则
C++继承中的二义性:
1 一个派生类A继承自多个具有某些同名成员a,b,c的基类B,C,..., 访问这些成员导致的二义性
解决方法:
1 在访问时加上基类名加作用域符
2 在派生类中重新定义自己的该成员
2 一个派生类A继承自多个基类B,C,..., 这些基类又是同一基类D的派生类, 在派生类A中访问继承自B,C的成员a,b,...c导致的二义性
解决方法:
1 在访问时加上基类名加作用域符
2 在派生类中重新定义自己的该成员
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
类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; }
路漫漫其修远兮,吾将上下而求索。