这两种调用基类副本分配的方式有什么区别?

无效指针

假设我有以下内容:

class A
{
public:
    A& operator= (A const& other)
    {
        return *this;
    }
};

class B : public A
{
public:
    B& operator= (B const& other)
    {
        static_cast<A&>(*this) = static_cast<A const&>(other);
        // or...
        A::operator=(other);
        return *this;
    }
};

要调用A副本分配运算符的版本,我可以执行以下任一操作:

static_cast<A&>(*this) = static_cast<A const&>(other);

或者:

A::operator=(other);

为什么要选择一个?两者之间有什么区别?

编辑

我的问题的最初示例是无效的,并且与我要问的问题相去甚远。我为这个错误表示歉意。我已经更新了上面的示例,使其更加清晰。

马克西姆·埃格鲁什金

static_cast<A&>(*this).foo()仍调用的派生版本foo这只是通过基类引用调用虚函数。

A::foo()关闭虚拟调度和调用是foo在class中实现的A,而不是在派生类中实现。


如果operator=in中不是virtual Astatic_cast<A&>(*this) = static_cast<A const&>(other)则是另一种说法A::operator=(other)(无需other转换,因为派生的基准引用转换是隐式的)。他们做同样的事情-打电话A::operator=

但是,通常operator=是在复制构造函数之后再进行交换的情况下实现的:

B& B::operator=(B other) { 
    other.swap(*this); 
    return *this;
}

B按价值计算所调用B的拷贝构造函数我们。如果B具有r值复制构造函数,则该赋值运算符可与r值以及仅移动BB例如,如果具有std::unique_ptr成员)一起使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

这两种调用基类副本分配的方式有什么区别?

来自分类Dev

这两种异步方法有什么区别?

来自分类Dev

这两种递归方法有什么区别

来自分类Dev

这两种PhysicsVector方法有什么区别?

来自分类Dev

这两种实现之间有什么区别?

来自分类Dev

这两种情况有什么区别?

来自分类Dev

这两种结构有什么区别

来自分类Dev

这两种函数声明有什么区别?

来自分类Dev

这两种语法有什么区别?

来自分类Dev

这两种 Scala 模式有什么区别?

来自分类Dev

这两种做法有什么区别:

来自分类Dev

这两种集群配置有什么区别?

来自分类Dev

这两种内存分配有什么区别?

来自分类Dev

这两种内存分配有什么区别?

来自分类Dev

这两种创建对象文字的不同方式有什么区别

来自分类Dev

递归中这两种方式有什么区别?

来自分类Dev

这两种方式创建对象有什么区别?

来自分类Dev

这两种声明函数的方式有什么区别?

来自分类Dev

这两种执行TypeScript方法的方式有什么区别?

来自分类Dev

这两种编写结构的方式有什么区别?

来自分类Dev

这两种在python中定义列表的方式有什么区别?

来自分类Dev

这两种在C ++中实现函数的方式有什么区别?

来自分类Dev

这两种在vb .Net中进行编码的方式有什么区别

来自分类Dev

这两种在Keras中添加神经网络层的方式有什么区别?

来自分类Dev

这两种初始化String的方式有什么区别

来自分类Dev

这两种在TypeScript中声明映射的方式有什么区别?

来自分类Dev

这两种在Node.js中连接到MongoDB的方式有什么区别

来自分类Dev

这两种为Rust通道克隆发件人的方式有什么区别?

来自分类Dev

这两种初始化HashMap的方式有什么区别?

Related 相关文章

热门标签

归档