请教:关于引用

zhengjian523 2006-05-10 06:30:46
#include<iostream>
using namespace std;

class Base
{
public:
void show()
{
cout<<"in the base class";
}
};

class Sub:public Base
{
public:
void show()
{
cout<<"in the sub class";
}
};

int main()
{
Sub s;
Base b=s;
b.show();
}

程序输出为in the base class
把Base b=s改为Base &b=s;在VC6里结果会是in the sub class,而在mingw里确还是一样,搞不懂什么问题,请高手指点!谢谢
...全文
267 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
freeldm 2006-05-11
  • 打赏
  • 举报
回复
b是属于Base的类型的,show()函数是隐藏而不是覆盖,所以调用的是in the base class, &b也是一样,如果加了virtual就是 in the sub class

Base b=s;只会缺割了s的一部分...
freeldm 2006-05-11
  • 打赏
  • 举报
回复
b是属于Base的类型的,show()函数是隐藏而不是覆盖,所以调用的是in the base class, &b也是一样,如果加了virtual就是 in the sub class

Base b=s;只会缺割了s的一部分...
cutenoob 2006-05-11
  • 打赏
  • 举报
回复
Base b=s 这里声明的b是Base的对象 所以说不论怎么调都是Base里的成员函数


Base &b=s 这里的&b可以理解为一个基类的指针,指向派生类 但基类中的show()方法没有加virtual, 所以说还是调Base类自己的成员函数
zhengjian523 2006-05-11
  • 打赏
  • 举报
回复
那Base &b1 = s;和Base *b1 = s有什么区别呢?
aniude 2006-05-10
  • 打赏
  • 举报
回复
b是属于Base的类型的,show()函数是隐藏而不是覆盖,所以调用的是in the base class, &b也是一样,如果加了virtual就是 in the sub class
逸学堂 2006-05-10
  • 打赏
  • 举报
回复
声明对象
in the base class
声明引用
in the base class
声明指针
in the base class
请按任意键继续. . .
sp6补丁包后。

严重怀疑lz的VC6
zhengjian523 2006-05-10
  • 打赏
  • 举报
回复
如果在Base中加上virtual就变为base sub sub
逸学堂 2006-05-10
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include<iostream>
#include <FSTREAM>
#include <string>

using namespace::std;

class Base
{
public:
void show()
{
std::cout << "in the base class" << endl;
}
string str;
};

class Sub:public Base
{
public:
void show()
{
cout <<"in the sub class" << endl;
}
};

int main(int argc, char* argv[])
{

Sub s;
Base b=s;

cout << "声明对象" << endl;

b.show();

cout << "声明引用" << endl;

Base &b1 = s;
b1.show();

cout << "声明指针" << endl;

Base *b2 = &s;
b2->show();

system("pause");
return 0;
}

在VC6(没有加sp6包)测试结果
声明对象
in the base class
声明引用
in the base class
声明指针
in the base class
请按任意键继续. . .
铖邑 2006-05-10
  • 打赏
  • 举报
回复
如果是虚函数的话,原来的代码显示base,改成Base &b=s后显示sub

Base &b=s这个表示b是引用,是s的别名
zhengjian523 2006-05-10
  • 打赏
  • 举报
回复
Base &b=s象这样的声明代表什么意思?b是指针吗?这样声明,并且父类是虚函数的话就显示为在sub,但搞不清原理
zhengjian523 2006-05-10
  • 打赏
  • 举报
回复
父类用虚函数仍然都显示在base
jixingzhong 2006-05-10
  • 打赏
  • 举报
回复
没有用 虚函数实现,
在标准情况下显示的应该是 base !!
jixingzhong 2006-05-10
  • 打赏
  • 举报
回复
xpdavis(咕嘟) ( ) 信誉:105 2006-05-10 18:39:00 得分: 0


VC6有点非标
=============
然!

铖邑 2006-05-10
  • 打赏
  • 举报
回复
show不是虚函数,应该都是显示in the base class
zhengjian523 2006-05-10
  • 打赏
  • 举报
回复
呵呵,还是没搞懂
寻开心 2006-05-10
  • 打赏
  • 举报
回复
因此,无论base 前面有无引用,用base调用show的结果都应该是一样的
都显示 in the sub base 才对
寻开心 2006-05-10
  • 打赏
  • 举报
回复
引用变量可以认为是被引用对象的别名

你可以输出base和s的变量地址看看,是相同的

以不同类型的变量来引用,相当于把被引用对象空间的内容,按照新的类型来解释
比如
int i = 3;
float &f = (float&)i;
f和i依然是相同的地址空间,但是f是浮点数,i是整数

sub是继承于base的,因此这个空间按照基类对象来解释,没有任何的问题的
也无需想float和int那样中间必须加一个 (float&) i; 这个强制转换才行。

zhengjian523 2006-05-10
  • 打赏
  • 举报
回复
我的理解是既然子类的引用赋值给了b,那么b也应该是子类的引用啊
铖邑 2006-05-10
  • 打赏
  • 举报
回复
VC6有点非标
king_water 2006-05-10
  • 打赏
  • 举报
回复
老大看错了吧,vc也是base
加载更多回复(1)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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