これは基本的な概念の質問です。Baseから継承するDerivedクラスがあり、新しいDerivedオブジェクトをインスタンス化する場合、そのBaseオブジェクトを選択した特定のBaseオブジェクトに設定して、すべての呼び出しベースクラスメソッドがこの特定のベースオブジェクトにリダイレクトされるようにできますか?
このようなもの:
class Base
{
protected:
string name;
public:
Base(string n) { name = n}
void doSomething(){cout << name << "\n";}
};
class Derived : public Base
{
public:
Derived(string n) : Base(n) {}
int main()
{
Derived* d = new Derived("original base"); //create a derived
d->doSomething(); // prints "original base"
Base* rB = new Base("replacement base"); // create a new base object
((Base*) d) = rB; // replace the base object of d with a new one (pretend code)
d->doSomething(); // prints "replacement base"
return 0;
}
私のスキルレベルは低いので、その単純なコードであらゆる種類のエラーを犯したと確信していますが、それは単なるアイデアです。
これはC++で可能ですか?派生した情報をオブジェクトから切り取ることができるので、継承のチェーン内のコンポーネントを分離して置き換えることができますか?
なぜ私はこれをしたいのですか?
ミックスインユリを考えてみましょう:(ここでも、構文エラーを許してください)
template <class T> class MyMixin : public T
{
public:
MyMixin(T desiredBaseObject)
{
// do something to set the desired base
// object of this class to desiredBaseObject.
}
};
RandomClass1 dog(int i = 0);
RandomClass2 cat(double i = 0.0);
MyMixin< RandomClass1 > mixin1(dog);
MyMixin< RandomClass2 > mixin2(cat);
この場合、ミックスインのベースオブジェクトを任意のオブジェクトに設定できれば、ミックスインがそれについて何も知る必要なしに、ミックスイン内の任意のパラメーターリストでコンストラクターを使用できます。また、ミックスインは、デコレータ間で共通のインターフェイスを必要とせずに、デコレータのように使用できます。
答えてくれてありがとう。オブジェクトの派生部分を切り取ることができるので、ベース情報と派生情報は別々に存在しているように見えます。誰かがこれについてコメントできますか?私がよく耳にするvtablesのようないくつかの内部テーブルにアクセスして(このタイプのものについては何も知らないので、おそらくこれは当てはまらないかもしれません)、これを達成できますか?
@Benoît
1と4だけが機能するのに、2と3は機能しない理由を説明してください。class Base {protected:std :: string name; public:Base(std :: string n){name = n; }
virtual void doSomething()
{
cout << name << "\n";
}
};
class Derived : public Base
{
public:
int x;
Derived(std::string n) : Base(n)
{
x = 5;
}
void printX()
{
cout << "x = " << x << "\n";
x++;
}
};
Derived* d1 = new Derived("original 1");
d1->doSomething();
d1->printX();
Base* rb1 = new Base("new 1");
*static_cast<Base*>(d1) = *rb1;
d1->doSomething();
d1->printX();
cout << "\n\n";
Derived d2 = Derived("original 2");
d2.doSomething();
d2.printX();
Base b2 = Base("new 2");
static_cast<Base>(d2) = b2;
d2.doSomething();
d2.printX();
cout << "\n\n";
Derived d3("original 3");
d3.doSomething();
d3.printX();
Base b3("new 3");
static_cast<Base>(d3) = b3;
d3.doSomething();
d3.printX();
cout << "\n\n";
Derived d4("original 4");
d4.doSomething();
d4.printX();
Base b4("new 4");
*static_cast<Base*>(&d4) = *&b4;
d4.doSomething();
d4.printX();
cout << "\n\n";
これは印刷されます:
元の1x=5新しい1x= 6
オリジナル2x=5オリジナル2x= 6
オリジナル3x=5オリジナル3x= 6
元の4x=5新しい4x= 6
なぜこれはポインターを使用する場合にのみ機能するのですか?