私は2つのクラスを派生させる抽象を設計するように私のプログラミングコースの宿題を持っており、その2つの派生クラスから別のクラスを派生させています。私は複数の継承で派生した基底クラスをどのように指定できますか?
これはDeadly Death of Deathの問題を引き起こします。私は最初の2つのクラスのオブジェクトを抽象クラスのポインタにインスタンス化する必要がありますが、仮想継承で解決できるものです。そして、これはどんな種類の仮想継承でも行うことはできません。したがって、複数の継承クラスが派生する基底クラスを指定する方法がある場合、それは天文学的に便利です。
例:
#include <iostream>
using namespace std;
class Base {
public:
virtual void foo(){};
virtual void bar(){};
};
class Der1 : public Base {
public:
virtual void foo();
};
void Der1::foo()
{
cout << "Der1::foo()" << endl;
}
class Der2 : public Base {
public:
virtual void bar();
};
void Der2::bar()
{
cout << "Der2::bar()" << endl;
}
class Join : virtual Der1, virtual Der2 {
private:
int atribb;
};
int main()
{
Base* obj = new Join();
((Der1 *)(obj))->foo();
}
コンパイラエラー:
nueve.cpp:機能において 'INTメイン()':
nueve.cpp:43:30:エラー: 'ベース' 'Join'のあいまいな基底です。
Base * obj = new Join();
純粋な仮想関数を調べ、真にBaseを持つだけでそれらを持つことを検討してください。 – UKMonkey
「これはどのような種類の仮想継承でもできません」と言うとき。どういう意味ですか?私は最初、あなたのクラスでこの割り当てに仮想継承を使用することを許可していないと言っていましたが、実際には仮想継承を使用したいが、あなたがしようとしていることをやり遂げることができないということを意味するでしょうか? –
"2つのクラスを派生させる抽象をデザインするように私に要求しています" - しかし、これはあなたがやったことではない、 'Base'は抽象ではない。 'Base'の関数を純粋仮想(' = 0'を加える)にする必要があります。私は、その場合でも仮想継承が必要かどうかは不明です。 –