gpt4 book ai didi

c++ - 正确实现类层次结构

转载 作者:行者123 更新时间:2023-11-28 02:30:59 24 4
gpt4 key购买 nike

假设我有一个接口(interface)层次结构:

class A
{
virtual void commonFunc() = 0;
};

class B1 : public A
{
virtual void b1SpecificFunc() = 0;
};

class B2 : public A
{
virtual void b2SpecificFunc() = 0;
};

接口(interface) A 的存在只是为了避免重复 commonFunc() 函数。

现在,如果我想实现它以获得 2 个可实例化类 ImplB1 和 ImplB2,我可以这样做:

class ImplA
{
virtual void commonFunc();
};

class ImplB1 : public ImplA
{
virtual void b1SpecificFunc();
};

class ImplB2 : public ImplA
{
virtual void b2SpecificFunc();
};

问题在于它使 ImplA 可以实例化,而我不想这样做。我只希望 ImplB1 和 ImplB2 是可实例化的,因为 ImplA 是抽象的东西,它的存在只是为了共同实现共同的功能。

请问我该如何设计?谢谢。

最佳答案

Interface A only exist to avoid duplicating the commonFunc() function.

您肯定是想避免重复其声明,不是吗?

class ImplA
{
virtual void commonFunc();
};

这大概应该是:

class ImplA : public A
{
virtual void commonFunc();
};

我想重点是 ImplA 实际上有一个 commonFunc 的实现。因此,为了这个答案的简洁起见,让我们将其放入类定义中:

class ImplA : public A
{
virtual void commonFunc() {} // implementation
};

The problem with this is that it makes ImplA instanciatable.

只需将 ImplA 的析构函数设为纯虚拟即可:

class ImplA : public A
{
public:
virtual ~ImplA() = 0 {}

private:
virtual void commonFunc() {}
};

即使在派生类的函数内部,这也会阻止实例化。例如,以下将产生编译器错误:

class ImplB1 : public ImplA
{
public:
virtual void b1SpecificFunc()
{
ImplA a; // error, cannot instantiate abstract class
}
};

事实上,您甚至无法在其自己的函数中实例化该类:

class ImplA : public A
{
public:
virtual ~ImplA() = 0 {}

private:
virtual void commonFunc()
{
ImplA a; // error, cannot instantiate abstract class
}
};

但说真的,这一切似乎都过度设计。也许您真正需要的是使 commonFunc 成为 A 的非虚保护函数,派生类可以在需要时调用它。

或者 commonFunc 可以只是一个独立的效用函数

关于c++ - 正确实现类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29015795/

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