使用参考[复制]时多态性并不总是有效
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用参考[复制]时多态性并不总是有效相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
在虚拟方法上使用引用时,我有一些意外的行为。基本上,如果我引用基类的对象,则将该引用更改为派生类的对象。当我调用虚方法时,会调用基类方法。
但是,如果我引用基类并将其初始化为派生类,则调用派生方法。这是一些代码。
// A base class with a virtual that prints the class
class BaseClass {
public:
virtual void printMe();
};
class DerivedClass : public BaseClass {
public:
void printMe() override;
};
void BaseClass::printMe() {
cout << "in Base"<<endl;
}
void DerivedClass::printMe() {
cout << "in Derived"<<endl;
}
int main () {
BaseClass bc = BaseClass();
DerivedClass dc = DerivedClass();
BaseClass * pbc = & bc ;
pbc->printMe(); // Prints in Base
pbc = & dc;
pbc->printMe(); // Prints in Derived
// Now with a reference
BaseClass & bcr = bc;
bcr.printMe(); // Prints in Base
bcr = dc;
bcr.printMe(); // Prints in Base !!!
BaseClass & foo = dc;
foo.printMe(); // Prints in Derived !!!
return 0;
}
如果有人能解释为什么第四张照片不是“衍生的”以及为什么第五张照片是“衍生的”,我将不胜感激。
我(现在)了解有关切片的内容 - 但根据该逻辑,我不明白为什么
BaseClass & foo = dc;
foo.printMe()
调用派生方法
没关系我现在看到它。
答案
必须初始化引用,但永远不能分配引用。
这意味着当你这样做:bcr = dc;
,你没有让bcr
参考dc
。相反,你正在获取dc
的值,“切片”它以创建基类的临时对象,然后将该临时值分配给bcr
引用的对象(即bc
)。之后,dcr
仍然引用bc
,并且bc
被赋予了一个新值(来自dc
的基类子对象)。
一旦引用引用一个对象(必须在引用创建时发生),它就可以/将始终引用该对象。任何赋值尝试都将分配给它引用的对象,而不是引用本身。
另一答案
这个:
bcr = dc;
不会将dc
分配给bcr
。
它将执行切片。它会切断派生类与基类相比所有额外的东西(换句话说它会像派生类一样处理派生类)。
以上是关于使用参考[复制]时多态性并不总是有效的主要内容,如果未能解决你的问题,请参考以下文章