【问题标题】:C++ base and derived class method troubleC++ 基类和派生类方法的麻烦
【发布时间】:2015-06-28 07:10:55
【问题描述】:

我有 1 个名为 AddOns 的基类,这个类有 9 个派生类。我也将向量定义为 shared_ptr

AddOnsContainer.h

std::vector<std::shared_ptr<AddOns>> container;

现在我的问题是我在 AddOns 中定义了一个方法

插件.h

virtual void ChangeDefaultSearchProvider();

我只想在其中一个派生类 (SearchProviders) 中覆盖。对于每个其他派生类,我想使用在 AddOns.h 中实现的代码。该方法被定义为虚拟方法,这应该对我有所帮助,但我的代码仍然为每个派生类运行基本方法,即使是我已覆盖的派生类也是如此。

这是来自派生类的方法的定义,它应该做一些不同的事情。

SearchProviders.h

virtual void ChangeDefaultSearchProvider() override final;

从这里我调用方法:

AddOnsContainer.cpp

void AddOnsContainer::ChangeDefaultSearchProvider(int pId)
{
    container[pId]->ChangeDefaultSearchProvider();
}

那么有人可以帮助我了解我应该如何在我的基类中定义该方法,以便以后我可以只在我的一个派生类中覆盖它。

否则我应该在每个派生类中实现这个方法,但据我所知,这不是 OOP 和继承的想法。

提前谢谢大家!

最好的问候, 马里奥·P.

附言

这是我将项目(SearchProviders)添加到向量的代码:

SearchProvider searchProviders;

while (searchProviders.FindNext())
{
    add_item(searchProviders);
}

【问题讨论】:

  • 看起来是正确的,因此创建对象并将它们添加到向量的代码是相关的。
  • 我建议将您的代码缩减为 mcve。如果这无助于解决您的问题,请在此处发布。
  • 如果我没有找到任何不同的解决方案来解决我的问题,很可能我会尝试减少代码并在此处发布。
  • 可能是切片问题?除此之外,您是否有任何证据证明您在container 中的派生对象当前并未全部被视为AddOns
  • 一切看起来都很好,肯定是其他地方有问题。你可以试试Ideone

标签: c++ class oop inheritance


【解决方案1】:

谢谢大家的帮助!

我在创建最小代码的过程中发现了我的代码中的问题。

问题出在: AddOnsContainer.cpp

void AddOnsContainer::ChangeDefaultSearchProvider(int pId)
{
    container[pId]->ChangeDefaultSearchProvider();
}

因为我是直接传pId,需要减1,因为我目前不使用Graphic界面,只使用控制台变体。

但是,由于我花了一些时间来创建原始代码的一些最小变体,因此我决定将其上传到 GitHub,并在 Stackoverflow 中提供链接。

可以通过以下方式访问代码: https://github.com/mariopavlov/C/tree/master/InheritanceExample

再次感谢大家! 最好的, 马里奥·P.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2017-04-03
    • 2016-07-03
    相关资源
    最近更新 更多