gpt4 book ai didi

c++ - 如何在没有动态转换的情况下在覆盖函数中使用派生参数

转载 作者:行者123 更新时间:2023-11-28 04:15:07 25 4
gpt4 key购买 nike

谁能告诉我如何实现:

  • 派生类方法的参数是参数的派生类(不是参数的基类)?

这就是我想要的:

class Base{
public:
// Base class method has ParameterBase parameter
virtual void f(ParameterBase pb) = 0;
}

class Derived : public Base{
public:
// I want: Derived class method has ParameterDerived parameter;
void f(ParameterDerived pd){ //do something with pd; }
}

class ParameterBase{
// Base class of parameter;
}

class ParameterDerived : public ParameterBase{
// Derived class of parameter;
}

如何实现以上?我是否必须在派生方法的参数列表中使用 ParamterBase 并在方法主体中使用 dynamic_cast 参数?

最佳答案

您要求的功能称为参数类型反方差。不幸的是,C++ 不支持它。 C++ 仅支持返回类型协变。 See这里有一个很好的解释。

Perhaps inconveniently, C++ does not permit us to write the function marked hmm... above. C++’s classical OOP system supports “covariant return types,” but it does not support “contravariant parameter types.”

但是你可以使用dynamic_cast<>()运算符(operator)。但首先,您必须将参数类型更改为指针或引用,并向您的 class ParameterBase 添加至少一个虚拟成员(虚拟析构函数也算在内)。让编译器为它创建虚拟方法表。这是带有引用的代码。可以改用指针。

class ParameterBase
{
public:
// To make compiler to create virtual method table.
virtual ~ParameterBase()
{}
};

class ParameterDerived : public ParameterBase
{
};


class Base
{
public:
// Pointers or references should be used here.
virtual void f(const ParameterBase& pb) = 0;
};

class Derived : public Base
{
public:
virtual void f(const ParameterBase& pb) override
{
// And here is the casting.
const ParameterDerived& pd=dynamic_cast<const ParameterDerived&>(pb);

}
};


int main()
{
Derived d;
ParameterDerived p;

d.f(p);
}

关于c++ - 如何在没有动态转换的情况下在覆盖函数中使用派生参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56842570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com