C++一个简单的静态联编的题目,答案为什么是这个???

Cql_liliang 2011-08-22 11:14:08

#include<iostream>
using namespace std;

class Base
{
public:
void Print(string str)
{
cout<<"Base"<<str<<endl;
}
};

class Derive1:public Base
{
public:
void Print(string str)
{
cout<<"Derive1"<<str<<endl;
}
};

class Derive2:public Derive1
{
public:
void Print(string str)
{
cout<<"Derive2"<<str<<endl;
}

};
int main(void)
{
Base ob1 ;
ob1.Print("::Print()");
Derive1 ob2 ;
ob2.Print("::Print()");
Derive2 ob3 ;
ob3.PrintPrint("::Print()");
return 0 ;
}


结果是:
Base::Print()
Derive1::Print()
Derive2::Print()
为什么 ob2 和 ob3 在调用Print函数的时候不会有二义性?? , 为什么它会正确的调用自己定义的Print函数???,而不是其它的,其原理是什么??
...全文
143 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cql_liliang 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pengzhixi 的回复:]
1.你这里是静态绑定,意味着你对象是什么类型就调用相应类型的函数。

2.派生类的同名非虚函数是会屏蔽掉基类同名函数。他们不是一种重载的关系,重载是需要处于同一个作用域的。
[/Quote]

哦, 我明白了, 谢谢!
yby4769250 2011-08-23
  • 打赏
  • 举报
回复
这个?这个?这个跟函数的多态其实是属于同一种静态多态方式,你考虑函数重载时为什么不会二义性的道理是什么,就是C++的编译器会根据函数名和函数参数编译生成另外一个名字
比如
foo(int x)
foo(folat x)
则编译后,可能会生成类似这样的函数名
_3foo_int(int x)
_3foo_float(float x)
而当派生中出现这个重载时,函数的重命名可能计算了类的类型,比如,对base类
可能为_4base_print_string(string str)
对Derive可能生成_5derive_print_string(string str)
都是类似的道理。
我们程序员所看到的print只是我们看到的,编译器在编译后,会把这个名字重名名,所以,函数的静态多态基本是这个道理。
猫xiaowai 2011-08-23
  • 打赏
  • 举报
回复
回错了,应该是函数的重载,不好意思。。
猫xiaowai 2011-08-23
  • 打赏
  • 举报
回复
结果是对的,如果你把Base和Derive1的print函数改为virtual void print(string str),你就会明白了。

类的继承和多态啊,看看书吧。
turing-complete 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jordancar 的回复:]

这不算是重载吧 覆盖了基类而已 SO。。
[/Quote]

确实是隐藏
wkq87 2011-08-23
  • 打赏
  • 举报
回复
这个应该叫函数的隐藏吧,或者说是跨越类边界的重载!林锐《C++高质量编程里有讲》
隐藏的定义:派生类的函数与基类的函数同名,且参数列表也相同,但基类中没有关键字virtual,那么就构成了函数的隐藏。此时派生类中的函数隐藏了基类的同名函数。所以就会出现以上结果
小布 2011-08-23
  • 打赏
  • 举报
回复
这不算是重载吧 覆盖了基类而已 SO。。
luciferisnotsatan 2011-08-23
  • 打赏
  • 举报
回复
没有virtual,覆盖了。
品茶 2011-08-23
  • 打赏
  • 举报
回复
因为你的静态联编写对了
pengzhixi 2011-08-23
  • 打赏
  • 举报
回复
1.你这里是静态绑定,意味着你对象是什么类型就调用相应类型的函数。

2.派生类的同名非虚函数是会屏蔽掉基类同名函数。他们不是一种重载的关系,重载是需要处于同一个作用域的。
we_sky2008 2011-08-23
  • 打赏
  • 举报
回复
楼主需要知道继承下的名字查找过程:
在继承下,派生类的域被嵌套在其直接基类的域中,
对于形式为obj.func();或者p->func();的函数调用在查找名字func时会首先在obj或p的静态类型的域中查找func,如果在该类中找到这个名字则查找结束,所以我们才说,派生类的成员函数可能会隐藏基类的成员函数,
如果一个名字在派生类的域中没有被解析出来才会在外围基类域中查找该名字。
zw1270644192 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chenxwzcc 的回复:]
结果是对的,如果你把Base和Derive1的print函数改为virtual void print(string str),你就会明白了。

类的继承和多态啊,看看书吧。
[/Quote]

++
buzaiyouy 2011-08-23
  • 打赏
  • 举报
回复
查一下重载,覆盖的区别就行了

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧