说我得到了:
class X_
{
public:
void do() { }
}
class Y_ : public X_
{
}
我有这个功能:
void foo(X_ whatever)
{
whatever.do();
}
我可以将“Y_”对象发送到foo函数吗,这会有效吗?
我刚才意识到自己可以自己测试一下:)
答案 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.
}