void * 是一个无类型指针。要通过指针调用对象的方法,指针必须是适当的类型。如果您知道它指向什么对象,则可以将 void * 显式转换为 CamDataA* 或 CamDataB*,但这不是您想要的(您事先不知道对象的类型)。
在你的情况下,使用虚拟方法很好。
1) 定义一个接口。 IE。定义一组没有实现的方法。
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是一个指向@987654333的指针@。
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
我希望你能在网上搜索所有对你来说陌生的词。 :)