gpt4 book ai didi

C++多重继承和鸭子类型(duck typing)

转载 作者:行者123 更新时间:2023-11-30 01:39:35 29 4
gpt4 key购买 nike

我正在尝试找到一种方法来为继承一对相似接口(interface)的两个对象表达共同的基类型。

请看下面的代码:很明显,fb1 和 fb2 应该有一个可能的公共(public)基类型(例如,类似 IFizzBu​​zz 的类型)。

有谁知道这是否可行(如果可能不需要模板:-)

谢谢!

#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;
}

最佳答案

FizzBu​​zz1FizzBu​​zz2 有 3 个公共(public)基类

  • IFizz
  • IBuzz
  • 嘶嘶声

如果不改变这两者的定义,就无法让它们也以 IFizzBu​​zz 为基础。

然而,您可以拥有一个派生 IFizzBu​​zz 的类并委托(delegate)给两者之一,例如

template <typename FizzBuzz>
struct Wrapper : IFizzBuzz
{
void DoFizz() final { fizzBuzz.DoFizz(); }
void DoBuzz() final { fizzBuzz.DoBuzz(); }
private:
FizzBuzz fizzBuzz;
}

然后可以使用它,例如

std::unique_ptr<IFizzBuzz> ifb = std::make_unique<Wrapper<FizzBuzz1>>();
ifb->DoFizz();
ifb->DoBuzz();
ifb = std::make_unique<Wrapper<FizzBuzz2>>();
ifb->DoFizz();
ifb->DoBuzz();

关于C++多重继承和鸭子类型(duck typing),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45349144/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com