【问题标题】:Checking if a pointer points to a particular class C++ [duplicate]检查指针是否指向特定类 C++ [重复]
【发布时间】:2012-08-10 16:12:05
【问题描述】:

可能重复:
Finding the type of an object in C++

我有一个关于检查指针以查看它们是否符合特定派生类并采取必要措施的问题。

假设我目前有 2 个派生类 DerivedClass1DerivedClass2 以及基类 BaseClass。我想检查以下操作。

Ptr<BaseClass> ptr;

if (ptr points to DerivedClass1) { 行动1 } 别的 { 行动2 }

如何检查指向特定 DerivedClass 的 ptr 点?

【问题讨论】:

  • 不,很可能你不想想知道*ptr的动态类型是什么。

标签: c++ pointers


【解决方案1】:
if(dynamic_cast<DerivedClass1*>(ptr))
{
  // Points to DerivedClass1
}
else if(dynamic_cast<DerivedClass2*>(ptr)
{
  // Points to DerivedClass2
}

【讨论】:

  • 如果有第三个级别,例如 DerivedClass1_1DerivedClass1_2,第一个 if 子句会将它们都视为 DerivedClass1 - 这可能是也可能不是 OP想要。
  • @Component10 我只是简单地回答了 OP 的问题。我不容忍这种做法,而且通常发现只有在做出糟糕的设计决策 时才需要这样做。感谢您指出继承情况,以防 OP 决定尝试这样的事情。
【解决方案2】:

如果你想多一点面向对象,你会在基类上把它变成一个虚方法:

Ptr<BaseClass> ptr;

ptr->Action();

并让每个类根据需要实现它。我意识到这不是一个实际的答案,但它是实现目标的另一种方式,通常被认为更好,这就是为什么我认为值得一提。

【讨论】:

  • 谢谢。这是我最初的想法,但我遇到了在特定类中有一个 const 方法而在另一个类中有一个非 const 的问题,因此试图在新方法中添加这种行为。
【解决方案3】:

如果BaseClass是多态的(包含虚函数),你可以测试:

if (dynamic_cast<DerivedClass1*>(ptr.get()))

但通常你应该按照 unwind 的建议使用动态调度,可能是访问者模式,用于这类事情。使用dynamic_cast 乱扔代码会使其难以维护。我几乎从不使用dynamic_cast

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多