2010-05-22 38 views

回答

3

是的,但它会被切成薄片 - 对象的所有Y_部分将被砍掉,这将成为一个X_。您通常需要在这种情况下引用传递,因为通常这样做()将是一个虚函数:

void foo(X_ & whatever) // ampersand means whatever is a reference 
{ 
    whatever.do(); 
} 

BTW,我不知道你怎么想的后缀下划线获得你,但我会什么都没说”。

1

它将努力把它 - 是的,但尼尔指出的对象将是切片,即一个X_对象将在原有基础Y_对象被创建。一个稍大的例子:

class Base 
{ 
public: 
    int func() { return 1; } 
    virtual virtfunc() { return 2; } 
} 

class Derived 
{ 
public: 
    int func() { return 3; } // Shadows (hides) Base::func. Never do this! 
    virtual int virtfunc() { return 4; } 
} 

int testfunc(Base b) { return b.func(); } 
int testvirtfunc(Base b) { return b.virtfunc(); } 
int testfuncbyref(Base& b) { return b.func(); } 
int testvirtfuncbyref(Base& b) { return b.virtfunc(); } 

void main() 
{ 
    Base b; 
    Derived d; 

    b.func(); // returns 1 
    b.virtfunc(); // returns 2 
    d.func(); // returns 3 
    d.virtfunc(); // returns 4. 

    testfunc(d); // returns 1 because func is non-virtual. 
    testvirtfunc(d); // returns 2 because a Base instance is created by the call. 
    testfuncbyref(d); // returns 1 because func is non-virtual. 
    testvirtfuncbyref(d); // returns 4 because the real d object is used and the function is virtual. 
} 
相关问题