我有几个类共享一个公共基类,除了它们的方法工作方式不同之外。因此,在下面的示例中,加法器和乘法器除了执行计算的方式不同之外都是相同的。
有没有办法即时将“a”更改为乘数?我是否需要实现派生类之间相互转换的方法?例如就像是
a = a.asMultiplier()
?
正如您在下面的代码中看到的,我尝试将reinterpret_cast转换为乘法器,但没有成功,它仍然像加法器一样工作。 (gcc OS X v4.2.1)
#include <iostream>
class Base {
protected:
int a,b;
public:
Base(int a, int b) {
this->a = a;
this->b = b;
}
virtual ~Base() { }
virtual int calculate() = 0;
};
class Adder : public Base {
public:
Adder(int a, int b) : Base(a, b) {
}
int calculate() {
return this->a + this->b;
}
};
class Multiplier : public Base {
public:
Multiplier(int a, int b) : Base(a, b) {
}
int calculate() {
return this->a * this->b;
}
};
int main() {
Base* a = new Adder(3,4);
Base* m = new Multiplier(3,4);
std::cout << "Adder gives " << a->calculate() << std::endl;
std::cout << "Multiplier gives " << m->calculate() << std::endl;
a = reinterpret_cast<Multiplier*>(a);
std::cout << "Now adder gives " << a->calculate() << std::endl;
delete a;
delete m;
return 0;
}
要解决这个问题,我想到的最好的办法是实现一个复制构造函数,采用基类:
class Multiplier : public Base {
public:
Multiplier(int a, int b) : Base(a, b) {
}
explicit Multiplier(const Base& iBase) : Base(iBase.a, iBase.b) {
}
int calculate() {
return this->a * this->b;
}
};
但由于我不是这里最先进的 C++ 开发人员,所以它可能不正确,或者其他人可能有更好的想法,只是尝试:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)