派生类对象是否可以被视为基类的相同类型? <noobieq> </noobieq>

时间:2010-05-22 09:36:04

标签: c++ inheritance oop class

说我得到了:

class X_
{
public:
    void do() { }
}

class Y_ : public X_
{
}

我有这个功能:

void foo(X_ whatever)
{
  whatever.do();
}

我可以将“Y_”对象发送到foo函数吗,这会有效吗?

我刚才意识到自己可以自己测试一下:)

2 个答案:

答案 0 :(得分:3)

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

void foo(X_ & whatever)   // ampersand means whatever is a reference
{
  whatever.do();
}
顺便说一句,我不知道你认为那些带有下划线的下划线会让你获益,但我会说“没有”。

答案 1 :(得分:1)

它可以发送它 - 是的,但是当Neil指出对象将切片,即将根据原始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.
}