为什么不覆盖此方法?
Why isn't this method being overridden?
在我的一个项目中,我遇到了这个多态似乎不起作用的问题。派生的 classes 似乎没有覆盖基础 class,但也没有发生错误。
这是对代码的简化,但它会产生同样的问题。 vector
和 unique_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
。
在我的一个项目中,我遇到了这个多态似乎不起作用的问题。派生的 classes 似乎没有覆盖基础 class,但也没有发生错误。
这是对代码的简化,但它会产生同样的问题。 vector
和 unique_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
。