是具有接口专用化的子类多态的模板实例化
Is the template instantiation of a subclass polymorphic with a specialization of an interface
我知道这是一种非常令人困惑的提问方式,所以让我解释一下我的意思。我有一个非常简单的界面。
为了便于讨论,让我们假装它看起来像:
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
?
换一种方式问,如果Derived
是Base
,Decorated<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>
。
换一种方式问,如果
Derived
是Base
,Decorated<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关系,即使A
和B
之间存在关系。实例化Blub<A>
时发生的所有情况是将类型A
替换为Blub
的定义。这样做的结果只不过是如果你自己编写了一个具有相应定义的新类,你会得到什么。
除此之外,可能应该注意的是,如果您发现自己想要执行向下转换,即从基指针强制转换为指向更派生类型的指针,这通常应该被视为整体设计可能存在非最佳内容的线索......
- 是具有接口专用化的子类多态的模板实例化
- 如何访问"std::variant"的任何子级的"多态"基类?
- C++将静态多态类自添加到子类的 constexpr 列表中
- 具有不同模板类型的子类的多态性
- 为什么我需要在子类中重新声明"虚拟"方法?[C++/多态性]
- c++多态性和传递子类
- 类多态性和相等运算符
- 我调用的函数不是通过多态访问子类的函数
- 无法从指针派生类转换为指针基类(多态性)
- C++ / 多态性 / 虚函数 / 为什么我的子类的函数没有被调用?
- 如何通过多态基类接口使用模板化的子类
- 继承/多态性-调用子类的方法
- C++在多态子类中添加虚拟方法
- 使用使基类多态
- C++工厂制造和多态性 ->调用由映射迭代器访问的实例的子类的虚拟方法
- 向下转换到子类的问题,多态不能工作
- C++多态性:从父类到子类
- 使用多态子类的各自方法
- 实例化子类的多态性问题
- 告诉编译器子类-多态性