有这段代码#include<iostream.h>class B
{
public: void print(){cout<<"BBB"<<endl;}
};class C:public B
{
public: void print(){cout<<"CCC"<<endl;}
};
void fun(B obj)
{
obj.print();
};void main()
{
C c;
fun(c);
c.print();
}按理论来说输出的两条结果都应该是"CCC",可是第一个输出的却是"BBB"
想不明白呀,有人能解释一下吗?

解决方案 »

  1.   

    这叫object sliciting
    你改下:
    #include <iostream.h> class B 

    public:
    virtual void print(){cout <<"BBB" <<endl;} 
    }; class C:public B 

    public:
    void print(){cout <<"CCC" <<endl;} 
    }; 
    void fun(B *obj) 

      obj->print(); 
    }; void main() 

    C c; 
    fun(&c); 
    c.print(); 
      

  2.   

    这叫object sliciting
    你改下:
    #include <iostream.h> class B 

    public:
    virtual void print(){cout <<"BBB" <<endl;} 
    }; class C:public B 

    public:
    void print(){cout <<"CCC" <<endl;} 
    }; 
    void fun(B *obj) 

      obj->print(); 
    }; void main() 

    C c; 
    fun(&c); 
    c.print(); 
      

  3.   

    这样改了之后结果是一样的,我就是不明白为什么会输出"BBB"
    如果是在JAVA里是两个"CCC"
      

  4.   

    C c; 
    fun(c); 
    这里调用的时候已经将C类变量c强制转换成了B类变量。
    这个叫什么来着忘记了,反正是收缩成了基类B了。
      

  5.   

    你那个print不是虚函数,强制转换为基类就会调用基类的函数。不要用JAVA的思想来考虑C++
      

  6.   

    不是覆盖,fun参数是B类的,而C是子类可以转成B的,换句话说就是C类被转换成了B类了
      

  7.   

    楼主你记住,Java中的对象在C++中是对象类型的指针