*
#include<iostream>
using namespace std;
class Base1
{
public:
int var;
void func(){ cout<<"this is Base1"<<endl;}
};
class Base2
{
public:
int var;
void func(){ cout<<"this is Base2"<<endl;}
};
class Derived:public Base1, public Base2
{
public:
int var;
void func(){ cout<<"this is Derived"<<endl;}
};
int main()
{
Derived d;
Derived *p = &d;
d.var = 1; // 对象名.成员名标识
d.func(); // 访问Derived类成员
d.Base1::var = 5; // 作用于分辨标示符
d.Base1::func(); // 访问Base1基类成员
p->Base2::var; // 作用于分辨标示符
p->Base2::func(); // 访问Base2基类成员
return 0;
}
#include<iostream>
using namespace std;
class Base1
{
public:
int var;
void func(){ cout<<"this is Base1"<<endl;}
};
class Base2
{
public:
int var;
void func(){ cout<<"this is Base2"<<endl;}
};
class Derived:public Base1, public Base2{};
int main()
{
Derived d;
Derived *p = &d;
d.var; // 错误,对象名.成员名具有二义性
d.func(); // 错误,对象名.成员名具有二义性
d.Base1::var = 3; // 作用于分辨标识符
d.Base1::func(); // 访问B1基类成员
p->Base2::var = 5; // 作用于分表标识符
p->Base2::func(); // 访问B2基类成员
return 0;
}
/*
如果不希望d.var和d.func()的用法不产生二义性,可以使用using 关键字加以澄清。例如:
class Derived:public Base1, public Base2
{
public:
using Base1::var;
using Base2::func();
}
using的一般功能是将一个作用域中的名字引入到另一个作用域中。他还有一个非常有用的用法:
将using用于基类中的函数名,这样派生类中如果定义同名但参数不同的函数,基类的函数不会被隐藏,
两个重载的函数将会并存在派生类的作用域中。例如:
class Derived:public Base1, public Base2
{
using Base1::func();
void func(int i){...}
};
这时,使用Derived的对象,既可以直接调用无参数的func函数,又可以直接调用带int型参数的func函数。
*/
#include<iostream>
using namespace std;
class Base1
{
public:
int var;
void func(){ cout<<"this is Base1"<<endl;}
};
class Base2
{
public:
int var;
void func(){ cout<<"this is Base2"<<endl;}
};
class Derived:public Base1, public Base2
{
public:
int var;
void func(){ cout<<"this is Derived"<<endl;}
};
int main()
{
Derived d;
Derived *p = &d;
d.var = 1; // 对象名.成员名标识
d.func(); // 访问Derived类成员
d.Base1::var = 5; // 作用于分辨标示符
d.Base1::func(); // 访问Base1基类成员
p->Base2::var; // 作用于分辨标示符
p->Base2::func(); // 访问Base2基类成员
return 0;
}
#include<iostream>
using namespace std;
class Base1
{
public:
int var;
void func(){ cout<<"this is Base1"<<endl;}
};
class Base2
{
public:
int var;
void func(){ cout<<"this is Base2"<<endl;}
};
class Derived:public Base1, public Base2{};
int main()
{
Derived d;
Derived *p = &d;
d.var; // 错误,对象名.成员名具有二义性
d.func(); // 错误,对象名.成员名具有二义性
d.Base1::var = 3; // 作用于分辨标识符
d.Base1::func(); // 访问B1基类成员
p->Base2::var = 5; // 作用于分表标识符
p->Base2::func(); // 访问B2基类成员
return 0;
}
/*
如果不希望d.var和d.func()的用法不产生二义性,可以使用using 关键字加以澄清。例如:
class Derived:public Base1, public Base2
{
public:
using Base1::var;
using Base2::func();
}
using的一般功能是将一个作用域中的名字引入到另一个作用域中。他还有一个非常有用的用法:
将using用于基类中的函数名,这样派生类中如果定义同名但参数不同的函数,基类的函数不会被隐藏,
两个重载的函数将会并存在派生类的作用域中。例如:
class Derived:public Base1, public Base2
{
using Base1::func();
void func(int i){...}
};
这时,使用Derived的对象,既可以直接调用无参数的func函数,又可以直接调用带int型参数的func函数。
*/