c++ - 未调用/继承子类中的移动赋值运算符

标签 c++ c++11

我有一个简单的基类和两个从它继承的类。问题是没有使用每个子类中的移动赋值运算符。这基本上是我所拥有的:

class Parent {
public:
    virtual ~Parent();
    virtual Parent& operator=(Parent &&parent);
};

class Child1 : public Parent {
public:
    ~Child1();
    Child1& operator=(Child1 &&child);
};

class Child2 : public Parent {
public:
    ~Child2();
    Child2& operator=(Child2 &&child);
};

实现中到处都是日志,所以我知道调用了什么以及调用的时间。然后,我运行这个(伪)代码:

Parent &p {};
if (x == 1)
    p = Child1 {};
else
    p = Child2 {};

我得到的输出看起来像这样:

: Child constructor
: Parent move operator
: Child destruct
: SIGSEGV

知道我做错了什么吗?

最佳答案

这是slicing的经典案例您在其中将派生类型的实例分配给基类型的实例。要解决此问题,您必须使用动态分配和指针:

std::unique_ptr<Parent> p;

if(x == 1)
  p = std::make_unique<Child1>();
else
  p = std::make_unique<Child2>();

关于c++ - 未调用/继承子类中的移动赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33620936/

相关文章:

c++ - 反转整数位的位置?

c++ - 交通标志检测与识别

c++ - 从枚举值中获取正确的模板化类实例化

c++ - std::is_assignable<A, B>::value 在 A 具有可变参数构造函数时始终为真

c++ - 调用模板类构造函数

c++ - Visual Studio 2013 (vs120) 要求错误的 boost 库

c++ - cppcheck 似乎可以工作,但没有出现 lint 结果(Sublime Text 3,Mac)

c++ - C++严格混叠规则使用Qt和QLinkedList编译错误

c++ - 基于构造函数的可访问性在函数之间进行选择的模板方法

c++ - 遍历动态 vector 时 auto 的异常行为