我有一个抽象的课程" Base"和十六进制,二进制等派生类....用户输入一个字符串,告诉我他目前使用的是什么基数并输入数字。我需要使用多态(而不是控制语句,如if,switch等等)来创建所需的对象或至少将该数字更改为十进制,这样我就可以在不同的基础上进行所需的计算来自用户。 我尝试了很多,但无法找到如何做到这一点。我目前的想法是动态调用" double toDec(const Base&)"功能,但不要认为这是正确的举动:
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
Base(string n, string b) : number(n), base(b) {}
virtual string whatBaseAreYou(string) = 0;
virtual double toDec(const Base&) { whatBaseAreYou(base); }
protected:
string number;
string base;
};
class Hex : public Base
{
public:
virtual double toDec(const Base&);
};
class Binary : public Base
{
public:
virtual double toDec(const Base&);
};
int main()
{
string number,base;
cin >> number >> base;
Base* b = new Base(number,base); //I know this line is compile error.. I don't know how to implement this...
}
我可以确定我当前的数字基数,但是如何在运行时动态创建例如二进制类?我甚至不确定我是否需要抽象类Base ... 我不知道我是否朝着正确的方向前进......这是一个继承+多态分配,这就是我需要用这些功能来解决它的原因。
答案 0 :(得分:1)
我认为你应该研究工厂方法模式。这将返回指向基类的指针,您将能够调用toDec方法。
通常工厂方法会要求你使用一些switch语句,但是如果你不想不惜一切代价这样做,那么看看如何在不使用if或者切换的情况下实现工厂:
https://stackoverflow.com/a/3502010/8855783
只有当每个派生类(来自Base)的construcor需要相同的参数
时,这才有效