使用参考[复制]时多态性并不总是有效

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

它将执行切片。它会切断派生类与基类相比所有额外的东西(换句话说它会像派生类一样处理派生类)。

以上是关于使用参考[复制]时多态性并不总是有效的主要内容,如果未能解决你的问题,请参考以下文章

CodeSense 在导入框架时并不总是有效

Python PyQt 信号并不总是有效

将焦点放在 WPF ComboBox 上并不总是有效

mocking bean 并不总是有效

使用 android 获取 gps 位置 - 并不总是有效

节点对于 Xpath 并不总是有效