c ++使用指向基类

时间:2017-10-12 18:25:14

标签: c++ embedded

我正在c ++中为嵌入式系统编写,其行为类似于多种类型的变量(int,float,string等)。 通过处理每种类型值的子类。 我需要为(+ - * / =!= + = - = ==><&& ||!)等多个运算符执行运算符重载 但是从指向基类的指针执行操作。 我应该怎么写这些功能? 我正在测试这样的东西,但它没有做到这一点。

class base
  { 
    public:
    virtual base& operator=(const base& other) {};
    virtual base& operator+(const base& other) {};
 ...
  }

class VarInt: public base
{
 public:
    int value;
    VarInt& operator=(const VarInt& other);
    VarInt& operator+(const VarInt& other);
}

class VarFloat : public base
{
 public:
    float value;
  ...
}

main(){
 ...
    base* varbase1 = new VarInt();
    base* varbase2 = new VarInt();
    *varbase1 = 1;
    *varbase2 = 2;
    *varbase1 += *varbase2;
}

1 个答案:

答案 0 :(得分:0)

你的问题在于假设当VarInt继承自base,那么:

virtual base& operator = (const base& other) {};

virtual VarInt& operator = (const VarInt& other) {};

是完全相同的事情。不幸的是,他们不是。你在这里做的是隐藏以前的方法。当您override虚拟函数时,您需要以与首次声明的方式完全相同的方式指定它,即:

virtual base& operator = (const base& other) {};

返回的base&可以绑定到VarInt个对象,所以我们在这里很安全。提供的参数const base&也可以引用VarInt对象。现在你必须考虑一下你真正希望在这里实现的目标。假设您的base课程中有多个具有不同功能的课程可以继承,例如,如果您尝试将VarFloat添加到VarInt会怎样?预期结果是什么?编译错误?抛出异常?

如果您真的希望启用operator =来处理继承类的所有排列,那么使用dynamic_cast<>static_cast<>就行了,但请记住,如果你碰巧需要使用演员阵容,你可能希望重新考虑你的设计。它们的使用不推荐

有关使用...cast的工作示例,请参阅此处:

class Base{
public:
    // mandatory for destructing the objects via pointer of a base class
    virtual ~Base() = default;

    virtual Base& operator = (const Base& other) {};
};

class VarInt : public Base{
public:
    virtual Base& operator = (const Base& other) override
    {
        const auto ptr = dynamic_cast<const VarInt*>(&other);
        if(ptr != nullptr){
            // do whatever you need to - the *other* object is of a type VarInt!
            // use *ptr* to use *other* as VarInt
            return *this;
        } else {
            // do whatever you need to, when *other* is NOT a VarInt!
            // throw an exception? Add nothing?
        }
    }
};

请注意这不建议用于日常使用 - 演员阵容是设计缺陷的标志,不应该是首选