我有一个基类a和派生类B。我希望能够交换它们所指向的对象。在指针的底层基对象上应用std::swap只交换基对象内容,而不交换派生对象的内容。如何修复该问题以使std::swap正常工作。
#include <iostream>
#include <memory>
class A {
public:
void setA(unsigned int value) { *a = value; }
unsigned int getA() { return *a; }
virtual void h(){}
protected:
std::unique_ptr<unsigned int> a = std::make_unique<unsigned int>();
};
class B : public A {
public:
void setB(unsigned int value) { *b = value; }
unsigned int getB() { return *b; }
protected:
std::unique_ptr<unsigned int> b = std::make_unique<unsigned int>();
};
int main() {
std::unique_ptr<A> oA = std::make_unique<B>();
oA->setA(100);
auto a = dynamic_cast<B*>(oA.get());
a->setB(30);
std::unique_ptr<A> oB = std::make_unique<B>();
oB->setA(1000);
std::swap(*oA.get(), *oB.get());
std::cout << dynamic_cast<B*>(oB.get())->getB() << std::endl;
std::cout << dynamic_cast<B*>(oA.get())->getB() << std::endl;
std::cout << dynamic_cast<B*>(oA.get())->getA() << std::endl;
return 0;
}
在本例中,有两个名为a
和b
的A*
变量(误导性地(,它们都指向B
对象。您希望std::swap(*a, *b)
交换完整的B
对象。如果你有办法做到这一点,那么如果a
实际上指向A
类型的对象,你希望它做什么?
不能交换A
和B
,因为对象的大小不同。您需要将"B"对象放在"A"曾经所在的位置,但内存中没有足够的空间。
当然,您可以交换指针本身:std::swap(a, b)
可以正常工作。