メンバー変数として特定の型を持つ抽象クラスを必要とするインターフェイスを指定したいと考えています。
ここで状況を再現してみます。
class Blob {
int data[32];
};
class Worker {
string name;
abstract void workOn(Blob&) = 0;
}
class Abstract {
vector<shared_ptr<W>> workerList;
Blob allTheStuff;
abstract void somethingElse() = 0;
void doAllTheWork() {
for (w : workerList) {
w->workOn(allTheStuff);
}
}
};
class B_Blob : public Blob {
int moreData[4096];
};
class BulbasaurTrainingCamp : public Abstract {
B_Blob allTheStuff;
void somethingElse() {} // implemented
// this class will accept Bulbasaurs into workerList
};
class Bulbasaur : Worker {
Bulbasaur(): name("Fushigidane") {}
void workOn(Blob& b) {
// bulbasaurs cover *all* their workspace with crap
for (int i=0; i<sizeof(b.data[0])/sizeof(b.data); ++i) {
b.data[i] = *((int*)&("crap"));
}
for (i=0; i<sizeof(b.moreData[0])/sizeof(b.moreData); ++i) {
b.moreData[i] = *((int*)&("crap"));
}
}
ここで、抽象basクラスにはBlob
がありますが、のインスタンスにBulbasaurTrainingCamp
は派生がありますB_Blob
。同じ名前を付けたので、コンパイラはそれを受け入れているようです。
これに名前はありますか?私が知りたいのは、これを行うときの動作です。を でオーバーライドしBlob
ましたB_Blob
か?
の中にアクセスできない基本Blob
インスタンスがぶら下がっているかどうかについては、基本的にわかりませんBulbasaurTrainingCamp
。私の期待は、それぞれBulbasaur
が. 私は、C++ が賢明に見えることを実際に行うことを望んでいます。それは、「コンパイルされたので、私は幸せだと思いますが、私はそれがやるべきだと思っていることをまだ完全には確信していません」というケースです.crap
B_Blob