【问题标题】:Compare type of variable比较变量类型
【发布时间】:2018-03-20 11:57:03
【问题描述】:

我在方法中使用从基类继承的不同类的一些对象。现在我遇到的问题是,当对象在其继承结构中具有特定类时,我不希望执行该方法。

(伪)代码示例如下所示:

class A {};
class B : A {};
class C : A {};
class D : B {};
class E : C {};

void method(A* _object)
{
    // If _object is of type C
    // return;
    // else do sth
}

我已经检查了this 问题,但这对我没有帮助,因为如果我正确理解其中一个答案,返回的名称取决于编译器。

编辑:因为有一些答案我应该重新考虑我的程序结构,我意识到重要的是要提到我没有洞察力,也没有真正的机会改变基类的结构,因为我我正在使用第三方库,我在这里提到的方法是来自这些基类之一的虚拟方法。因此,如果您遇到类似的问题,接受的答案是好的,但如果您有一个不依赖第三方库的程序,最好重新考虑结构并像他的 Petar Velev 中描述的那样做某事回答。

【问题讨论】:

  • 如果你按值获取你的对象,你有切片并且只有A,即使你传递了C
  • A _object 始终是 A 类型。也许你想要一个引用或指针?如果是这样,dynamic_cast 就是答案
  • 如果A是多态的,可以使用虚方法/dynamic _cast
  • “现在我遇到了问题……” 这通常是设计缺陷的明确指标。你应该考虑一下。
  • 使do_sth() 成为A 中的虚函数。在C 类中添加一个不执行任何操作的版本。

标签: c++ inheritance


【解决方案1】:

如果你介绍一个函数foo说,

struct A {virtual void foo(){}};
struct B : A {};
struct C : A {void foo() final {/*a no-op*/}};
struct D : B {};
struct E : C {};

然后void method(A* _object) 可以使用_object->foo(); 调用foo。具体来说,C 中的覆盖是无操作的。标记覆盖final 意味着不能在C 的子类中重新引入该方法;例如E

从 C++11 开始,能够将最终确定性引入虚函数已成为 C++ 标准的一部分。

这在风格上比使用dynamic_cast 更可取。

【讨论】:

    【解决方案2】:

    您可以使用面向对象的方式。 将此方法设为基类 A 中的虚拟方法。

    然后在 A 类中添加 do smth 并覆盖它以在 C 类中不执行任何操作。

    【讨论】:

      【解决方案3】:
      void method(A* _object)
      {
          C* c_object = dynamic_cast<C*>(_object);
          if (c_object)
             return;
          // else do sth
      }
      

      正如 Massimiliano Janes 和 Fureeish 在 cmets 中所说,您需要 A 是多态的。可以通过定义一个虚方法来完成:

      class A {
         virtual ~A() = default;
      };
      

      【讨论】:

      • 你能区分EC吗?
      • 这是错误的,dynamic_cast需要多态类型,A不是
      • @tobi303 这是要求吗?我在 OP 的问题中没有看到它
      • @tobi303 无需区分它们。如果它是 C 或 E 或其他任何从 C 继承的东西,则应该总是有一个返回
      • @Rafiwui,只是想提一下,如果您打算像在示例中那样使用它,这需要公共继承。此外,您需要 A 是多态的。简单的virtual ~A() = default 就能解决问题
      猜你喜欢
      • 2019-01-23
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 2016-01-13
      相关资源
      最近更新 更多