倪萍父母为什么离婚:子类中using引入基类函数时需要注意的情况 - OOPhaisky的专栏 - CSDN博...
来源:百度文库 编辑:偶看新闻 时间:2024/05/08 05:48:43
子类中using引入基类函数时需要注意的情况 收藏
子类中using引入基类函数时需要注意的情况class base{
public:
void test(){
cout << "base::test()" << endl;
}
void test(int){
cout << "base::test(int)" << endl;
}
};class derived : public base{
public:
void test(){
cout << "derived::test()" << endl;
}
};
此时derived::test()会隐藏(hide)父类中的两个test重载函数(base::test()和base::test(int)),因此我们为子类中加上一个using声明:
class derived : public base{
public:
void test(){
cout << "derived::test()" << endl;
}
using base::test;//此声明放在test前面和后面效果都一样
};现在会不会出现下面所述的情况呢?
---------------------------------------------------------------------------------------------------------------
既然using base::test将父类中的两个test函数都引入子类,则子类中就相当于有了一个void test()函数,所以我们在子类中重新定义的void test()函数将会和从父类中引入的void test()函数发生冲突,进而出现“重定义”错误。
---------------------------------------------------------------------------------------------------------------
答案是:不会!
此时,子类中重新定义的void test()函数将“顶替”从父类中引入的void test()函数。
(PS:从父类中引入的另外一个void test(int)函数则没有发生变化(仍然是父类中的函数实现)。)类似的另外一种情况如下,此时加入了virtual:
class base{
public:
virtual void test(){
cout << "base::test()" << endl;
}
virtual void test(double){
cout << "base::test(double)" << endl;
}
void test(int){
cout << "base::test(int)" << endl;
}
};class derived : public base{
public:
void test(){
cout << "derived::test()" << endl;
}
};
此时derived::test()虽然重写(override)了base::test(),但是同时也隐藏(hide)父类中的两个test重载函数(一个virtual函数base::test(double)和一个nonvirtual函数base::test(int))。现在,我们为子类中加上一个using声明:
class derived : public base{
public:
void test(){
cout << "derived::test()" << endl;
}
using base::test;//此声明放在test前面和后面效果都一样
};
与上面的类似,此时derived::test()“仍然重写”了父类的base::test(),并且与父类中的base::test(double)和base::test(int)[在子类的域]中形成重载集合。
最后,留一个思考题目,如下:
class base{
public:
virtual void test(){
cout << "base::test()" << endl;
}
virtual void test(double){
cout << "base::test(double)" << endl;
}
void test(int){
cout << "base::test(int)" << endl;
}
};class derived : public base{
public:
void test(){
cout << "derived::test()" << endl;
}
//using base::test;
};class A : public derived{
public:
void test(double){
cout << "A::test(double)" << endl;
}
};int main(int argc, char **argv){
base *pb = new A;
pb->test(2.4);
return 0;
}问题:derived中的using base::test加上与否,对程序的结果有什么影响?
答:没有影响。(关键点:名字解析是编译时期的事情,而virtual函数动态绑定是运行时期的事情。)
(PS:但是将main函数改成“derived *pd = new A; pd->test(2.4);”,则有区别了:如果将using base::test去掉,则编译失败。) 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/OOPhaisky/archive/2007/01/24/1492560.aspx
子类中using引入基类函数时需要注意的情况class base{
public:
void test(){
cout << "base::test()" << endl;
}
void test(int){
cout << "base::test(int)" << endl;
}
};class derived : public base{
public:
void test(){
cout << "derived::test()" << endl;
}
};
此时derived::test()会隐藏(hide)父类中的两个test重载函数(base::test()和base::test(int)),因此我们为子类中加上一个using声明:
class derived : public base{
public:
void test(){
cout << "derived::test()" << endl;
}
using base::test;//此声明放在test前面和后面效果都一样
};现在会不会出现下面所述的情况呢?
---------------------------------------------------------------------------------------------------------------
既然using base::test将父类中的两个test函数都引入子类,则子类中就相当于有了一个void test()函数,所以我们在子类中重新定义的void test()函数将会和从父类中引入的void test()函数发生冲突,进而出现“重定义”错误。
---------------------------------------------------------------------------------------------------------------
答案是:不会!
此时,子类中重新定义的void test()函数将“顶替”从父类中引入的void test()函数。
(PS:从父类中引入的另外一个void test(int)函数则没有发生变化(仍然是父类中的函数实现)。)类似的另外一种情况如下,此时加入了virtual:
class base{
public:
virtual void test(){
cout << "base::test()" << endl;
}
virtual void test(double){
cout << "base::test(double)" << endl;
}
void test(int){
cout << "base::test(int)" << endl;
}
};class derived : public base{
public:
void test(){
cout << "derived::test()" << endl;
}
};
此时derived::test()虽然重写(override)了base::test(),但是同时也隐藏(hide)父类中的两个test重载函数(一个virtual函数base::test(double)和一个nonvirtual函数base::test(int))。现在,我们为子类中加上一个using声明:
class derived : public base{
public:
void test(){
cout << "derived::test()" << endl;
}
using base::test;//此声明放在test前面和后面效果都一样
};
与上面的类似,此时derived::test()“仍然重写”了父类的base::test(),并且与父类中的base::test(double)和base::test(int)[在子类的域]中形成重载集合。
最后,留一个思考题目,如下:
class base{
public:
virtual void test(){
cout << "base::test()" << endl;
}
virtual void test(double){
cout << "base::test(double)" << endl;
}
void test(int){
cout << "base::test(int)" << endl;
}
};class derived : public base{
public:
void test(){
cout << "derived::test()" << endl;
}
//using base::test;
};class A : public derived{
public:
void test(double){
cout << "A::test(double)" << endl;
}
};int main(int argc, char **argv){
base *pb = new A;
pb->test(2.4);
return 0;
}问题:derived中的using base::test加上与否,对程序的结果有什么影响?
答:没有影响。(关键点:名字解析是编译时期的事情,而virtual函数动态绑定是运行时期的事情。)
(PS:但是将main函数改成“derived *pd = new A; pd->test(2.4);”,则有区别了:如果将using base::test去掉,则编译失败。) 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/OOPhaisky/archive/2007/01/24/1492560.aspx
概率论中引入函数思想的意义
c++中定义一个对象时,子类和基类的构造顺序???
Access2003中在引入图片时为什么需要选择图片的格式?
Access2003中在引入图片时为什么需要选择图片的格式?
数据库中 实体的超类和子类 是什么?
可以在定义一个函数时,将它的虚参定义为抽象类,然后调用时传入它的子类吗?
操作系统中引入进程的原因
电流计算中引入矢量的条件
大虾们,C#中子类可以调用父类的变量吗?
考中国电子科技大学的电子类研究生需要什么书
在用餐时中需要注意什么样的礼仪?
C++一个类和子类的实现
计算机启动时DOS系统的引导过程中被引入的病毒叫什么
c++程序中在外部函数调用时需要把那个函数所在的文件包含进来吗?
录像过程中需要注意的事项
求职中需要注意的问题
asp中怎么样同时父类与子类一起显示?
c++父类方法中能否定义子类对象?
Java在执行子类的构造函数之前,会先调用父类中没有参数的构造函数,其目的是什么?
在xml文档中引入dtd的优缺点
通信系统中最容易引入噪音的环保
3DS 中import命令引入的问题?
在饭店企业中引入CIS的有关问题?
汉语中是引入外国的词有那些 ?