C++中的支配规则的问题

来源:百度知道 编辑:UC知道 时间:2024/06/10 22:21:21
//test.h
class B1{
int x,y;
public:
void show(){cout<<"B1"<<endl;}
}

class B2{
int x;
public:
void show(){cout<<"B2"<<endl;}
}

//main.cpp
#include"test.h"

class D:public B1,public B2{
int x;
public:
void set(int a) {B1::x=a;} //A
void show() {cout<<"D.x="<<x<<endl;} //B
};
void main()
{
D d;
d.show(); //C
}
书中说程序不存在二义性,其中行A与行B中对X的访问均是对派生类D中的成员X的访问,而行C中的函数调用也是调用派生类中的成员函数show().这是由于支配规则在起作用之故.

我的疑问是:行A中不是使用了成员名B1与作用域运算符"::"明确地指出函数中是对基类B1的成员X进行赋值吗!!!?如果按我的思维继续考虑下去行C的d.show()没有用"::"作用域运算符,编译器不清楚这里的show()是指基类B1d的还是B2的中的成员!!!可是书上却说"行C中的函数调用也是调用派生类中的成员函数show().这是由于支配规则在起作用之故."

我觉得书上应该不会说错
可能是我那里理解不对
可能是我对支配规则不太理解吧?!
上述的例子怎么能很好的理解支配规则呢?
不好意思
程序是有点错误,我是为了方便就省

支配规则我说得很清楚了,既然你不想我改程序,我干脆把代码修改的部分删去,好让你仔细读读我写的文字。

C++的支配规则就是这样:
★在基类和派生类有重名(但可以访问)的成员时,优先派生类的成员
★如果要访问基类成员,必须加上作用域符::
★私有(private)成员连派生类也不可以访问,只有本类和友类可以访问,而类成员默认(像你这样不写private)都是私有的
★如果派生类要访问基类的成员,应该用protected类型。

兄弟,这段代码执行会有问题。我改了改:
// 1
#include <iostream>
using namespace std;
//test.h
class B1{
public:
int x,y;
public:
void show(){cout<<"B1"<<endl;}
};

class B2{
public:
int x;
public:
void show(){cout<<"B2"<<endl;}
};

//main.cpp

class D:public B1,public B2{
public:
int x;
public:
void set(int a) {B1::x=a;} //A
void show() {cout<<"D.x="<<x<<endl;} //B
};

int main()
{
D d;
d.set(1);
d.show(); //C
cout.flush();
cin.sync();
cin.get();
return 0;
}
这段代码输出的不