注册 登录
编程论坛 C++教室

为什么输出结果不是我期望的?

qlc00 发布于 2009-10-15 23:22, 511 次点击
#include <iostream>
using namespace std;
class B0{
public:
    void display(){cout<<"B0::display()"<<endl;}
};
class B1:public B0
{
public:
    void display(){cout<<"B1::display()"<<endl;}

};
class D1:public B1
{
public:
    void display(){cout<<"D1::display()"<<endl;}
};
void fun(B0 *ptr)
{
    ptr->display();
}
void main()
{
    B0 b0;
    B1 b1;
    D1 d1;
    B0 *p;
    p=&b0;
    fun(p);
    p=&b1;
    fun(p);
    p=&d1;
    fun(p);
}
我希望的显示的结果是
B0::display()
B1::display()
D1::display()
而在Visual C++中的结果是
B0::display()
B0::display()
B0::display()
能告诉我这是为什么?基类对象可以用指针来访问派生类的,为什么没有显示我期待的那种
2 回复
#2
flyingcloude2009-10-16 00:17
void fun(B0 *ptr)
{
    ptr->display();
}
这个函数中,把对象都转成B0了。
如果想要得到你期望的那样,那把代码改成如下的

#include <iostream>
using namespace std;
class B0{
public:
    virtual void display(){cout<<"B0::display()"<<endl;}
};
class B1:public B0
{
public:
    virtual void display(){cout<<"B1::display()"<<endl;}
};
class D1:public B1
{
public:
    virtual void display(){cout<<"D1::display()"<<endl;}
};
void fun(B0 *ptr)
{
    ptr->display();
}
void main()
{
    B0 b0;
    B1 b1;
    D1 d1;
    B0 *p;
    p=&b0;
    fun(p);
    p=&b1;
    fun(p);
    p=&d1;
    fun(p);
}
#3
qlc002009-10-16 11:27
但是我看一个C++视频讲解中为什么没有将display()申明成虚函数?
1