2013-04-05 35 views
2

假设我有4个类:A,B,C和D.指向类族内各种类型指针的限制?

A是基类。 B选自A. Ç衍生自A衍生

d是从B.

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

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

我可以通过如下方式创建“家庭内”通用指针: A * pUniversal;

并且点p通向A,B,C或D可交换到存储在其类型的向量中的对象..然后将Z的变量设置为pUniversal?

+1

你应该根据你所使用的语言标记您的问题,甚至编写一些代码来支持你的问题。 – mpm 2013-04-05 01:39:52

+0

真的吗?这是一个普遍的问题 – Habit 2013-04-05 01:41:19

+1

'A * pUniversal'对我来说并不普遍。 – mpm 2013-04-05 01:42:25

回答

2

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

如果您有A中的功能需要执行BC,请确保它们是虚拟的。

+0

好的很酷。感谢您的确认!是的,我喜欢使用虚拟。 – Habit 2013-04-05 01:58:07

1

是的,你可以!不,我不是奥巴马= P,但你可能会考虑阅读关于reinterpret_cast<>关键字(运营商)的东西。


编辑:reinterpret_cast<>可用于投基类的指针的派生类的指针。

+1

虽然'reinterpret_cast' _can_可用于向下转换,但它不是合适的工具。而且,这个问题不是无论如何都不关心。 – jogojapan 2013-04-05 02:06:13

+0

static_cast <>会更好,但有一点预见,你甚至不需要这个。 – 2013-04-05 03:51:40

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; 
    }