【问题标题】:Limitations on pointers to various types within a class family?指向类族中各种类型的指针的限制?
【发布时间】:2013-03-27 07:29:59
【问题描述】:

假设我有 4 个班级:A、B、C 和 D。

A 是基类。 B源自A。 C派生自A。

D 派生自 B。

我有每种对象的向量。

我创建了从相关类(家庭?)中排除的第 5 个类,称为 Z。 Z 包含一个指向 A 类对象的变量,称为 purple。

我能否通过执行以下操作来创建“家族间”通用指针: A * pUniversal;

并将 pUniversal 指向 A、B、C 或 D 可互换地指向存储在其类型向量中的对象。然后将 Z 的 purple 变量设置为 pUniversal?

【问题讨论】:

  • 你应该根据你使用的语言标记你的问题,甚至写一些代码来支持你的问题。
  • 真的吗?...这是一个普遍的问题
  • A * pUniversal 对我来说并不普遍。

标签: c++ class pointers inheritance derived-class


【解决方案1】:

是的,你可以这样做。这是派生类的主要好处之一。

如果A 中的函数应该由BC 实现,请确保它们是虚拟的。

【讨论】:

  • 好酷。感谢您的确认!是的,我喜欢使用虚拟。
【解决方案2】:

是的,你可以!不,我不是 Obama =P,但您可以考虑阅读有关 reinterpret_cast<> 关键字(运算符)的内容。


编辑:reinterpret_cast<> 可用于将基类的指针转换为派生类的指针。

【讨论】:

  • 虽然reinterpret_cast 可以用于向下转换,但它不是合适的工具。此外,无论如何,问题不在于垂头丧气。
  • static_cast 会更好,但稍加考虑,您甚至不需要它。
【解决方案3】:

一个例子:

  #include <iostream>
  #include <vector> 
  class A
  {
  public:
    virtual void SayHi() {
      std::cout<<"A says hi"<< std::endl;
    }

  };

    class B : public A
    {
    public:
        virtual void SayHi() {
          std::cout<<"B says hi"<<std::endl;
        }

    };

    class C: public A 
    {
    public:
        virtual void SayHi() {
          std::cout<<"C says hi"<<std::endl;
        }
    };

    typedef std::shared_ptr<A> APtr;
    typedef std::vector<APtr> Container;

  int main()
  {
      Container myContainer;
      // Store A's instance or any of its derivatives.
      myContainer.push_back(APtr(new A));
      myContainer.push_back(APtr(new B));
      myContainer.push_back(APtr(new C));

      for(/*Container::iterator or */ auto pbase = myContainer.begin(); pbase != myContainer.end(); pbase++)
          (*pbase)->SayHi();

      myContainer.clear();

      return 0;
  }

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 2017-08-10
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2013-04-05
    • 2010-10-22
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多