【发布时间】:2020-08-28 20:15:53
【问题描述】:
经过一番搜索,我还没有找到解决此问题的现有问题。如果我遗漏了什么,我深表歉意。
我有一个带有参数结构和设置器的基类。我想重新定义派生类中的 params 结构是什么样的,并通过基类指针设置它。比如下面这样的。
class A
{
public:
struct paramsType
{
int a;
int b;
};
protected:
paramsType params;
public:
void setParams(const paramsType& params) { this->params = params; }
};
class B : public A
{
public:
struct paramsType
{
int c;
int d;
int e;
};
};
class C : public A
{
public:
struct paramsType
{
int f;
};
};
int main () {
A* ptrB = new B();
A* ptrC = new C();
B::paramsType paramsB;
paramsB.c = 0;
paramsB.d = 1;
paramsB.e = 2;
C::paramsType paramsC;
paramsC.f = 3;
ptrB->setParams(paramsB);
ptrC->setParams(paramsC);
delete ptrB;
delete ptrC;
}
我尝试将基类“setParams”设为虚拟并在派生类中重新定义它,但是当我通过基类指针调用该方法时,它的类型不兼容。
在实际用例中,B 和 C 共享大量在 A 中实现的功能。它们只是具有不同的参数集。我只能访问基类指针,但会知道对象是 B 还是 C。有没有一种优雅的方法来解决这个问题?
谢谢!
【问题讨论】:
-
您不能以您希望的方式重新定义 C++ 中的类型(有充分的理由)。我怀疑你可能想让参数本身成为一个多态类,但是如果没有更多信息,就不可能知道这是否会解决你的问题。 A 中的常见逻辑是什么样的,它需要两组不同的参数?除了将数据传递给 A 之外,B 类和 C 类还做其他事情吗?如果您可以编辑示例代码以了解数据的使用方式,将会很有帮助。
标签: c++ class polymorphism