相关疑难解决方法(0)

在C++中继承operator =的麻烦

我遇到了operator =的继承问题.为什么这段代码不起作用,解决它的最佳方法是什么?

#include <iostream>

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

    bool operator==(const A & a)
    {
        return x == a.x;
    }

    virtual int get() = 0; // Abstract

protected:
    int x;
};

class B : public A
{
public:
    B(int x)
    {
        this->x = x;
    }

    int get()
    {
        return x;
    }
};

class C : public A
{
public:
    C(int x)
    {
        this->x = x;
    }

    int get() …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance abstract-class operator-keyword

17
推荐指数
1
解决办法
6012
查看次数

检测基类的分配以指向派生类的引用

我目前正在调查多态类型和赋值操作之间的相互作用.我主要担心的是有人是否可能尝试将基类的值分配给派生类的对象,这会导致问题.

这个答案中我了解到,基类的赋值运算符总是被派生类的隐含定义的赋值运算符隐藏.因此,对于赋值给简单变量,不正确的类型将导致编译器错误.但是,如果通过引用进行赋值,则情况并非如此:

class A { public: int a; };
class B : public A { public: int b; };
int main() {
  A a; a.a = 1;
  B b; b.a = 2; b.b = 3;
  // b = a; // good: won't compile
  A& c = b;
  c = a; // bad: inconcistent assignment
  return b.a*10 + b.b; // returns 13
}
Run Code Online (Sandbox Code Playgroud)

这种形式的赋值可能会导致不一致的对象状态,但是没有编译器警告,并且代码看起来对我来说是非邪恶的.

是否有任何成熟的习惯用于检测此类问题?

我想我只能希望运行时检测,如果我找到这样一个无效的赋值就抛出异常.我刚才能想到的最好的方法是基类中的用户定义的assigment运算符,它使用运行时类型信息来确保this实际上是指向base实例的指针,而不是派生类的指针,然后执行手动逐个成员的副本.这听起来像很多开销,严重影响代码可读性.有更容易的事吗?

编辑:由于某些方法的适用性似乎取决于我想做什么,这里有一些细节.

我有两个数学概念,比如.每个领域都是一个环,但不是相反.有几种实施方式中的每个,并且它们共享共同的基类,即AbstractRingAbstractField,从前者衍生后者.现在我尝试实现基于的易于编写的引用语义 …

c++ inheritance reference assignment-operator

6
推荐指数
1
解决办法
457
查看次数

为什么operator =不从模板类继承

我有以下模板代码:

class ClassName{};

template <class T>
class TemplatePtr
{
public:
    void operator=(T* p)
    {

    }
};

class TemplatePtr_ClassName: public TemplateePtr<ClassName>
{
public:
    ~TempaltePtr_ClassName();
};


void Test()
{
    TemplatePtr_ClassName data;
    data = new ClassName;
}
Run Code Online (Sandbox Code Playgroud)

但编译失败并显示错误消息(VS2008):

错误C2679:二进制"=":没有操作员发现它采用类型>>"类名*"的右边的操作数(或没有可接受的转化率)

为什么它不起作用,因为我在模板基类中定义了一个运算符?

c++ inheritance templates

5
推荐指数
2
解决办法
2553
查看次数