为什么不覆盖此方法?

Why isn't this method being overridden?

在我的一个项目中,我遇到了这个多态似乎不起作用的问题。派生的 classes 似乎没有覆盖基础 class,但也没有发生错误。

这是对代码的简化,但它会产生同样的问题。 vectorunique_ptr 的用法与我的项目中的用法相同,我怀疑我对它们的用法是导致问题的原因。

我希望

void print() override 
{ 
    printf("B HEJ");
}

覆盖

virtual void print() 
{ 
    printf("A HEJ"); 
}

,但事实并非如此。为什么?

这里是完整的源代码:

#include <iostream>
#include <string>
#include <memory>
#include <vector>

class A
{
public:
    virtual void print() 
    { 
        printf("A HEJ"); 
    }
};

class B : public A
{
public:
    void print() override { printf("B HEJ"); }
};

int main()
{
    std::vector<std::unique_ptr<A>> ass;
    ass.emplace_back(std::make_unique<A>(B()));
    ass[0]->print();
    std::cin.get();
}

您需要 make_unique<B> 添加一个 virtual 析构函数到基 class.

  • make_unique<B> 创建一个 unique_ptr<B>,如果 B 派生自 A 将被(移入)一个 unqiue_ptr<A>.
  • make_unique<A>(B())B 复制构造一个 A,切片 B(只有默认构造的 [=15= 的 A 部分] 将被复制)。
  • 只要保留virtual方法链,就调用最派生的方法。没有 virtual 析构函数可确保当您有 vector 个基 class 指针时,仅调用基 class 析构函数。结果往往是灾难性的。您希望调用最派生的 classes 的析构函数 - 所以将基础 class 析构函数设为 virtual.
#include <iostream>
#include <string>
#include <memory>
#include <vector>

class A
{
public:
    virtual ~A() = default;
    
    virtual void print() 
    { 
        printf("A HEJ"); 
    }
};

class B : public A
{
public:
    void print() override { printf("B HEJ"); }
};

int main()
{
    std::vector<std::unique_ptr<A>> ass;
    ass.emplace_back(std::make_unique<B>());
    ass[0]->print();
}

你这里有错误:

 ass.emplace_back(std::make_unique<A>(B()));

此行创建一个指向 A 的唯一指针,通过从默认构造的 B 复制来初始化它。对于裸指针,它等同于 new A(B())

您需要创建一个指向 B 的唯一指针,因此您的代码应如下所示:

 ass.emplace_back(std::make_unique<B>());

同时,不要忘记将虚拟析构函数添加到 A