比较变量的类型

时间:2017-10-09 09:56:29

标签: c++ inheritance

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

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

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 答案。

3 个答案:

答案 0 :(得分:3)

如果你引入一个函数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)可以使用foo致电_object->foo();。具体而言,C中的覆盖是无操作。标记覆盖final意味着无法在C的子类中重新引入该方法;例如E

能够将终结性引入虚函数已成为C ++ 11以后C ++标准的一部分。

这在风格上优于使用dynamic_cast

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

void method(A* _object)
{
    C* c_object = dynamic_cast<C*>(_object);
    if (c_object)
       return;
    // else do sth
}

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

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