2

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

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

D派生自B。

我有每种类型对象的向量。

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

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

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

4

3 回答 3

2

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

如果您有A应该由Bor实现的功能C,请确保它们是虚拟的。

于 2013-04-05T01:55:33.730 回答
1

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


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

于 2013-04-05T01:58:24.060 回答
0

一个例子:

  #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;
  }
于 2013-04-05T02:09:33.667 回答