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;)
};
CamDataBase
3) 次に、ポインターまたはその子孫のいずれかを受け取る関数を定義します。
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
Web で新しい単語を検索してみてください。:)