如何在不动态转换的情况下在覆盖函数中使用派生参数

时间:2019-07-01 21:17:11

标签: c++ parameters polymorphism overriding

谁能让我知道如何实现:

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

这就是我想要的:

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吗?

2 个答案:

答案 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' ) {
    }
}