我正在使用从方法中的基类继承的不同类的一些对象。现在我遇到的问题是,当对象在其继承结构中有一个特定的类时,我不希望该方法被执行。
(伪)代码示例如下所示:
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 答案。
答案 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;
};