gpt4 book ai didi

c++ - 公共(public)继承基类,私有(private)继承派生类

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:13 30 4
gpt4 key购买 nike

奇怪的继承情况:

class Base
{
public:
public virtual foo() = 0;
};

class A : public Base
{
public:
public virtual foo() override;
protected:
int bar;
};

class B : public A//something like 'public Base, protected A'
{
public:
public virtual foo() override;
};

基本上,B 可以继承 A 的所有内容,但只能“看到”(并且只能转换为)Base。基本上,我想在 B 中使用 A 的一系列功能,但希望 B 在语义上与 A 不同:

B b;
Base* valid_ptr = &b;//want this to be ok
A* invalid_ptr = &b;//want this to be invalid
A& invalid_ref = b;//want this to be super invalid
A prevent(b);//want this to not be allowed to happen

最佳答案

首先,只有当 A 派生自 Base 时,您的代码才能编译。如果 Base 对每个人都是公开的,并且 A 受到保护,那么唯一的方法就是不通过 A 将 Base 继承给 B。

由于 A 不可见,因此 B 可以解决

class A: public Base 
{ ... };

class B: public Base
{
A a;
public:
...
};

如果存在 Base 的两个实例到 B 中(一个作为 B 的基,另一个随 a 成员)是 Not Acceptable ,另一种方法是通过虚拟基地:

class A: 
public virtual Base
{ ... };

class B:
public virtual Base,
protected A
{ ... };

这将使 A 通过 B 不可见(不能隐式转换为 A),但 A 和 B 之间只有一个 Base 是公共(public)的。

在所有情况下,共享虚拟基的使用是一个常见的习语,对象通过成员函数支配(所谓的“堆叠平行四边形继承”)或通过任意数量的接口(interface)(“菱形对象”)共享部分实现。

OOP 纯粹主义者往往不喜欢这些数字,但它们是适当的 C++ 公民(即使由于缺少多重继承而在其他受 OOP 启发的经典语言中找不到任何表示形式!)

关于c++ - 公共(public)继承基类,私有(private)继承派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20959259/

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