C++:继承中同名成员处理方式
1、继承中的同名成员属性
a、若子类和父类中存在同名属性,调用该属性时优先调用子类中该属性;
b、若须调用父类中的同名属性,须加上父类作用域。
#include <iostream>
using namespace std;
class Base
{
public:
int var;
public:
Base()
{
this->var = 10;
}
};
class Son: public Base
{
public:
int var;
public:
Son()
{
this->var = 20;
}
};
int main()
{
Son s;
// 子类和父类存在同名属性,优先调用子类同名属性
cout<<"Son.var = "<<s.var<<endl; // Son.var = 20;
// 父类同名属性调用方式
cout<<"Base.var = "<<s.Base::var<<endl;
return 0;
}
2、继承中的同名成员函数
a、若子类和父类中存在同名函数,调用该函数时优先调用子类中该函数;
b、若须调用父类中的同名函数,须加上父类作用域。
#include <iostream>
using namespace std;
class Base
{
public:
void func()
{
cout<<"Base中的func调用"<<endl;
}
void func(int var)
{
cout<<"Base中的func(int)调用"<<endl;
}
};
class Son: public Base
{
public:
void func()
{
cout<<"Son中的func调用"<<endl;
}
};
int main()
{
Son s;
// 优先调用子类中的func
s.func();
// 指定父类的作用域调用父类中的func
s.Base::func();
// 当子类重定义了父类同名成员方法,子类的同名成员方法会隐藏父类中所有重载同名
// 版本,须利用作用域显式指定调用父类成员函数。
//s.func(10);
s.Base::func(10);
}
3、继承中的静态同名成员函数
a、类对象调用静态同名成员函数规则与调用一般同名成员函数规则相同;
b、可通过类名直接调用静态同名成员函数。
#include <iostream>
using namespace std;
class Base
{
public:
static int var; // 类内声明,类外调用
public:
static void funct()
{
cout<<"Base中的static funct调用"<<endl;
}
};
int Base::var = 100; // 类内声明,类外调用
class Son: public Base
{
public:
static int var; // 类内声明,类外调用
public:
static void funct()
{
cout<<"Son中的static funct调用"<<endl;
}
};
int Son::var = 200; // 类内声明,类外调用
int main()
{
// 1、通过类对象访问
Son s;
cout<<"Son.var = "<<s.var<<endl;
s.funct();
cout<<"Base.var = "<<s.Base::var<<endl;
s.Base::funct();
// 2、通过类名访问
cout<<"Son.var = "<<Son::var<<endl;
Son::funct();
cout<<"Base.var = "<<Son::Base::var<<endl;
Son::Base::funct();
}