谁能让我知道如何实现:
这就是我想要的:
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吗?
答案 0 :(得分:1)
您要的功能称为参数类型反差。不幸的是,C ++不支持它。 C ++仅支持返回类型协方差。 See此处提供了很好的解释。
也许不方便,C ++不允许我们编写函数 在上面标记为嗯。 C ++的经典OOP系统支持“协变 返回类型”,但不支持“变量参数 类型。”
但是您可以使用dynamic_cast<>()
运算符。但是首先,必须将参数类型更改为指针或引用,并在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);
}
答案 1 :(得分:0)
假设您希望使用ParameterDerived调用Derived,但是您还想在抽象基类中声明接口。
接口必须具有相同的参数类型,但是您仍然可以在Derived :: f
中使用dynamic_cast强制执行正确的参数子类。$post = get_post();
if ( has_blocks( $post->post_content ) ) {
$blocks = parse_blocks( $post->post_content );
if ( $blocks[0]['blockName'] === 'core/heading' ) {
}
}