【问题标题】:Polymorphism whilst using boost::shared_ptr使用 boost::shared_ptr 时的多态性
【发布时间】:2013-11-17 01:23:32
【问题描述】:

如果我有一个带有父类 A 和子类 B 和 C 的继承层次结构,我如何通过 boost::shared_ptr 使用多态性,以便函数

virtual void my_func(boost::shared_ptr<A> x) = 0;

可以实现为

void my_func(boost::shared_ptr<B> x);

void my_func(boost::shared_ptr<C> x);

?即使有 shared_ptr 概念,多态性是否仍然有效?

(很高兴知道这是否适用于 std::shared_ptr 以及 boost)

【问题讨论】:

  • 这些函数签名是不等价的。所以我不认为你在这里完全压倒一切。

标签: c++ boost c++11 polymorphism overriding


【解决方案1】:

在 C++ 中重写函数时,参数类型必须与基类中的相同。唯一允许的变化是,如果基类返回指针或引用,则覆盖函数可能具有协变返回类型。

对于参数类型,任何潜在的变化都取决于它是什么类型的参数:

  • 输入参数需要是逆变的:如果您知道更特殊的类可以处理它们,则可以允许传入更通用的参数。
  • 输出参数必须是协变的:任何调用都可以处理基类型的对象,即,当知道类是特殊的时,可以获得更特殊的东西是可以的。
  • C++ 没有指示输入或输出参数,即参数始终是输入和输出参数。因此,它们是不变的。

【讨论】:

  • 您能否详细说明第一点:为什么输入参数可以是逆变的?为什么不像 output/retval 那样协变?
  • @IgorR.:输入参数必须立即从Liskov Substitution Principle (LSP) 派生出逆变:如果base.f(x) 可以被调用,derived.f(x) 必须是可调用的。当derivedx 限制为与base 使用的派生类相比时,很明显derived.f(x) 不能与所有输入一起调用base.f(x) 可以,并且您有LSP 违规。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2012-12-04
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多