假设我有 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 个班级:A、B、C 和 D。
A 是基类。B源自A。C源自A。
D派生自B。
我有每种类型对象的向量。
我创建了从相关类(家庭?)中排除的第 5 个类,称为 Z。Z 包含一个指向 A 类对象的变量,称为紫色。
我可以通过执行以下操作来创建“家族间”通用指针: A * pUniversal;
并将 pUniversal 指向 A、B、C 或 D 可互换地指向存储在其类型向量中的对象。然后将 Z 的紫色变量设置为 pUniversal?
是的,你可以这么做。这是拥有派生类的主要好处之一。
如果您有A
应该由B
or实现的功能C
,请确保它们是虚拟的。
是的你可以!不,我不是 Obama =P,但您可能会考虑阅读有关reinterpret_cast<>
关键字(运算符)的内容。
编辑:reinterpret_cast<>
可用于将基类的指针转换为派生类的指针。
一个例子:
#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;
}