void *
是一个无类型指针。要通过指针调用对象的方法,指针必须是适当的类型。void *
如果您知道它指向CamDataA*
什么对象,您可以显式地转换您的CamDataB*
对象,但这不是您想要的(您事先不知道对象的类型)。
在您的情况下,使用虚拟方法很好。
1)定义接口。即定义一组没有实现的方法。
class CamDataBase {
public:
virtual int getImageStart() = 0; // "=0" means abstract methods - MUST be
virtual int getImageSize() = 0; // overriden in descendants
};
关键字virtual
意味着该方法可以在后代类中被覆盖。这意味着如果我们有一个指针,比如说CamDataBase* p
,并且指针指向某个后代类,例如p = new CamDataA()
,并且如果我们写p->getImageStart()
,那么将会有一个对应于对象(CamDataA::getImageStart()
)的真实(当前)类型的方法调用,而不是CamDataBase::getImageStart()
,虽然p
是指向 的指针CamDataBase
。
2) 现在定义接口的几个实现。与父类中的虚拟方法具有相同签名的方法会覆盖它们。
class CamDataA: public CamDataBase {
int getImageStart() {return ptrToStart;)
int getImageSize() {return imageSizeVariable;)
};
class CamDataB: public CamDataBase {
int getImageStart() {return ptrToStart;)
int getImageSize() {return width*height*channels;)
};
3) 现在定义一个函数,该函数接受一个指向CamDataBase
或其任何后代的指针:
void reportSize(CamDataBase* camData) // using the base class
{
// type of the object and the appropriate method
// are determined at run-time because getImageSize() is virtual
std::cout << camData->getImageSize();
}
这里有几个例子:
CamDataA A;
CamDataB B;
reportSize(&A); // CamDataA::getImageSize() is called
reportSize(&B); // CamDataB::getImageSize() is called
CamDataBase *p = &A;
reportSize(p); // CamDataA::getImageSize() is called
// and even if we cast pointer to CamDataA* to a pointer to CamDataB*:
reportSize((CamDataB*)&A); // CamDataA::getImageSize() is called
我希望你能在网上搜索所有对你来说陌生的词。:)