gpt4 book ai didi

c++ - C++代理模式中的虚函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:56 25 4
gpt4 key购买 nike

如果我有一个代理模式 Class A 并且它的代理是 Class PrxA。问题1

如果我在 A 中将几个函数定义为 virtual,即使在 PrxA 中,那些也应该被定义为 virtual >?

现在如果

Class B : public A
{
///code
}

我相信代理类也应该继承。

Class PrxB : public PrxA {
/// code
}

现在假设这些代理类有以下规则

  1. 实例化c'tor中的原始类
  2. 将在内部传递任何跨不同内部类传递的引用/指针参数
  3. 要获取代理类的实际实现(即从 PrxA 获取 A,我们有一个 impl 存储,它将为我们提供 A来自 PrxA 和来自 PrxBB

现在有一个 C 类,它在其 c'tor 中将 PrxA 作为引用。

`C::C(PrxA& A): pa(A),a(getImpl(PrxA))

正在初始化的类 C 的本地成员。

PrxA& pa;
A& a;

如果我通过 A,它会很好用。这里没问题。

问题2当我将 B 传递给此类 C 时,获取 B 的实现的最佳方式是什么(第二个在 C 的 c'tor 中初始化? (注意 B 派生自 A)

我可以考虑在 getImpl(A) 中进行这样的转换,但看起来不是一个好的解决方案。

A* getAImpl(PrxA& pa)
{
if (implA(pa) != NULL)
return A;
else
return dynamic_cast<B>(A); // can't do this. since A will be returned but I actually need B
}

如果我需要将 PrxB 传递给像 C 这样以 PrxA 作为引用的类,我应该采用什么方法?有没有比类型转换的方法。

这里还有一件有趣的事情,如果我们限制为一个构造函数,我们可以获得 PrxA 或 PrxB 的引用,需要相应地处理这些引用才能在初始化器中获取 impl。我需要知道一个好的方法。

最佳答案

If I define few functions as virtual in A are those supposed to be defined as virtual even in PrxA?

仅当您打算从 PrxA 派生同时能够将 PrxA 视为多态基类时。 (从您的帖子的其余部分来看,情况确实如此。)

`C::C(PrxA& A): pa(A),a(getImpl(A)) If I pass A it Will work great. No problem here. When I pass B to this class C what's the best way to get the B's impl (the second initialized in C's c'tor? (note B is derived from A)

这就是事情变得困惑的地方..你不能在这里传递 A 除非 A 派生自 PrxA..你需要在措辞上更精确一点,或者使用代码来解释。

如果您要传递 PrxB(同样,不是 B)并且 PrxB 派生自 PrxA(您已展示),那么由于 PrxB 应该实现与 PrxA 相同的接口(interface)(应用 Liskov 替换原则),您应该能够获得 A&从 PrxB 完全一样。这包括您需要获取 A& 到 B 实例的情况,假设 B 派生自 A。

What approach should I be taking here if I need to pass PrxB to the classes like C which is taking PrxA as reference?

正如您已经证明 PrxB 派生自 PrxA 那么这应该已经可以正常工作了,因为您使用的是 PrxA&,它可以是对 PrxB 实例的引用,没问题。

关于c++ - C++代理模式中的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7143930/

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