是具有接口专用化的子类多态的模板实例化

Is the template instantiation of a subclass polymorphic with a specialization of an interface

本文关键字:子类 多态 实例化 接口 专用      更新时间:2023-10-16

我知道这是一种非常令人困惑的提问方式,所以让我解释一下我的意思。我有一个非常简单的界面。

为了便于讨论,让我们假装它看起来像:

class Interface 
{
    public:
    virtual ~Interface() = default;
    virtual someMethod() = 0;
};

我有一个类是mixin,decorator或CRTP,但我不确定适用什么术语

template< typename interface_t > 
class Disablable: public interface_t
{
    public:
    ~Disablable() override = default;
    setDisable(const bool shouldDisable) { mDisabled = shouldDisable; }
    someMethod() override 
    {
        if(mDisabled) return;
        interface_t::someMethod();
    }
    private:
    bool mDisabled = true;
};

我的问题是多态性如何与这个装饰器相互作用。假设我想从Interface动态转换为Disablable<Interface>,我的具体实例化会是一个Disablable<Interface>吗?

例如,假设我有一个实现

class ConcreteImplementation: public Interface
{
    void someMethod() override 
    {
        std::cout << "I printed to cout" << std::endl; 
    }
};

在代码中的其他地方,我实例化了一个不可理解的,因此,

std::unique_ptr<Interface> pInterface(new Disablable<ConcreteImplementation>());

有没有办法像Disablable一样插入pInterface

基本上,这是真的吗: dynamic_cast<Disablable<Interface>>(new Disablable<ConcreteImplementation>) != nullptr

换一种方式问,如果DerivedBaseDecorated<Derived>Decorated<Base>吗?

假设我想从Interface动态转换为Disablable<Interface>,我的具体实例化会是一个Disablable<Interface>吗?

您的Disablable<T>源于T。因此,如果您有指向 Disablable<Interface> 对象的 Interface 子对象的指针或引用,则可以将此Interface指针或引用强制转换为指向Disablable<Interface>实例的指针或引用。当然,这仅在您的Interface指针或引用确实引用Disablable<Interface>Interface子对象时才有效。

基本上,这是真的吗: dynamic_cast<Disablable<Interface>>(new Disablable<ConcreteImplementation>) != nullptr

不。 ConcreteImplementation来源于Interface,而不是来自Disablable<Interface>Disablable<ConcreteImplementation>来源于ConcreteImplementation,来源于Interface,而不是Disablable<Interface>

换一种方式问,如果DerivedBaseDecorated<Derived>Decorated<Base>吗?

不。假设Decorated<T>派生自T,则Decorated<Base>派生自Base。所以Decorated<Base>就是Base.Decorated<Derived>将是Derived,这也是Base,但不是Decorated<Base>

模板和运行时多态性之间没有特殊的关系或交互。类模板是可以从中实例化类类型的模板。类模板可以是多态类类型的模板。因此,类模板的实例可以是多态类型。但这并不能改变同一类模板的不同实例是不相关的类型这一事实。如果Blub是类模板,则Blub<A>Blub<B>之间通常没有is-a关系,即使AB之间存在关系。实例化Blub<A>时发生的所有情况是将类型A替换为Blub的定义。这样做的结果只不过是如果你自己编写了一个具有相应定义的新类,你会得到什么。

除此之外,可能应该注意的是,如果您发现自己想要执行向下转换,即从基指针强制转换为指向更派生类型的指针,这通常应该被视为整体设计可能存在非最佳内容的线索......