我正在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;
}
答案 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?
}
}
};
请注意这不建议用于日常使用 - 演员阵容是设计缺陷的标志,不应该是首选