1
我想找到一種方法來表示繼承一對類似接口的兩個對象的公共基類型。C++多繼承和鴨打字
請參閱下面的代碼:很明顯,應該爲fb1和fb2提供一個可能的通用基本類型(例如,像IFizzBuzz)。
有誰知道這是可能的(而無需模板如果可能的話:-)
謝謝!
#include <memory>
#include <iostream>
struct IFizz {
virtual void DoFizz() = 0;
};
struct IBuzz {
virtual void DoBuzz() = 0;
};
struct Fizz : public IFizz {
void DoFizz() override {
std::cout << "Fizz\n";
}
};
struct Buzz1 : public IBuzz {
void DoBuzz() override {
std::cout << "Buzz1\n";
}
};
struct Buzz2 : public IBuzz {
void DoBuzz() override {
std::cout << "Buzz2\n";
}
};
struct FizzBuzz1 : public Fizz, public Buzz1 {
};
struct FizzBuzz2 : public Fizz, public Buzz2 {
};
// Expected "Base type" of FizzBuzz1 and FizzBuzz2
struct IFizzBuzz : public IFizz, public IBuzz {
};
int main()
{
{
FizzBuzz1 fb1;
fb1.DoFizz();
fb1.DoBuzz();
}
{
FizzBuzz2 fb2;
fb2.DoFizz();
fb2.DoBuzz();
}
// {
// // The line below is not legit and does not compile
// std::unique_ptr<IFizzBuzz> ifb(new FizzBuzz1());
// ifb->DoFizz();
// ifb->DoBuzz();
// }
return 0;
}
失敗的語句只有在IFizzBuzz是一個明確的基類FizzBuzz1時纔有效。但是,'FizzBuzz1'根本不會從'IFizzBuzz'繼承。如果你想有一個共同的基礎,那麼'FizzBuzz1'需要直接或間接地明確地繼承它。 – Peter
@Peter:這就是爲什麼我添加標籤「鴨子打字」;-) –