我給下面的例子來說明我的問題:如何結合在C++中共享相同基類的兩個類?
class Base
{
public:
virtual void do()=0;
}
class A: public Base
{
public:
void do();
};
class B: public Base
{
public:
void do();
}
class AB: public Base
{
public:
void do()
{
a_.do();
// if not succeed
{
b_.do();
}
}
private:
A a_;
B b_;
}
從上面的代碼中,我們可以看到,類來自同一個基類A, B
和AB
。然而,類AB
需要調用類A
和類B
。這是我的問題:AB
這個班級的潛在問題是什麼?還有其他的選擇嗎?
一種選擇可能是:
class Base
{
public:
virtual void do()=0;
}
class A: public Base
{
public:
void do();
};
class B: public Base
{
public:
void do();
}
class AB: public A
{
public:
void do()
{
A::do();
// if not succeed
{
b_.do();
}
}
private:
B b_;
}
你已經顯示了你想要做什麼,但不是_why_所以不清楚你想要解決什麼問題,所以很難說什麼是有效的替代方案。知道「do()」做什麼會有幫助,因爲它會告訴我們'AB'是否可以用'A'或'B'替代(用Liskov術語來說),所以從一個或者它們派生出來是否合理。 (N.B.'do'是一個關鍵字,所以不是一個有效的函數名稱,而且這個。do()'是無效的C++,它應該是'this-> A :: do();')。 –
你可以做多重繼承,但它通常是一個不良的做法,並揭示了一個概念問題。你做得對。 –
@PierreEmmanuelLallemant:不,MI在C++中不是邪惡的。建議閱讀:Bjarne Stroustroup的FAQ條目。 – lorro