经过一番探索,我还没有找到一个解决这个问题的现有问题。如果我错过了什么我很抱歉。
我有一个带有params结构和setter的基类。我想重新定义派生类中的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。有什么好的方法来解决这个问题吗?
谢谢!
发布于 2020-05-13 03:59:30
不能重新定义类型,但您可以为参数创建一个公共基类。
因此,您可以将A::paramsType作为一个基类,并从中派生B::paramsType和C::paramsType。然后将指向A::paramsType的指针存储在A类中。这样,您就可以使用公共基类来传递参数。
但是,为了访问B::paramsType和C::paramsType的成员,您需要降低继承层次结构。您可以在成员函数中实现这一点。如果B::paramsType是从A::paramsType派生的,那么它将能够访问A::paramsType的所有公共成员和受保护成员;同样,对于C::paramsType也是如此。
会是这样的:
class A
{
public:
struct paramsType
{
virtual ~paramsType() = default;
int a;
int b;
};
protected:
std::unique_ptr<paramsType> params;
public:
void setParams(std::unique_ptr<paramsType> params) { this->params = std::move(params); }
};
class B : public A
{
public:
struct paramsType : A::paramsType
{
int c;
int d;
int e;
};
private:
B::paramsType* getParams() { return dynamic_cast<B::paramsType*>(params.get()); }
};工作版本的这里。
发布于 2020-05-12 20:43:20
在您的示例中,只需将A改为
class A
{
public:
struct paramsType
{
int a;
int b;
int c;
};
protected:
paramsType params;
public:
void setParams(const paramsType& params) { this->params = params; }
};然后A可以使用paramsType::a和b,而c可以忽略paramsType::b和c。
https://stackoverflow.com/questions/61761048
复制相似问题