具有自动存储持续时间的虚拟功能似乎不起作用

Cha*_*son 0 c++ polymorphism virtual-functions

我在使用自动存储持续时间声明的对象使用虚函数时遇到问题.这是一个可重现的场景:

#include <iostream>

class A {
    public:
        A() {}
        virtual ~A() {}
        virtual void printClassName() {
            std::cout << "A" << std::endl;
        }
};

class B : public A {
    public:
        B() : A() {}
        ~B() {}
        void printClassName() {
            std::cout << "B" << std::endl;
        }
};

class Test {
    private:
        A item;

    public:
        Test() {}
        ~Test() {}
        void setItem(A item) {
            this->item = item;
        }
        A getItem() {
            return this->item;
        }
};

int main() {
    Test t;
    B item;

    t.setItem(item);
    t.getItem().printClassName();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这打印"A",而我​​希望它打印B.我很好奇为什么.

先感谢您!

Bar*_*rry 8

你在这里切片:

void setItem(A item) {
    this->item = item;
}
Run Code Online (Sandbox Code Playgroud)

B当你item进入时setItem(),这部分被切掉了,所以你失去了它的基础部分.如果A是抽象的,这将是一个更明显的错误(因为你不能按值存储抽象类).

相反,您将要将项目存储为指针.