C++排除通过派生类中的基类继承的类

C++ Exclude classes inherited through base class in derived class

本文关键字:基类 继承 派生 排除 C++      更新时间:2023-10-16

在C++中,是否可以从子类中排除基类中继承的类?

例如,如果你有三个这样的类:

class A
{
public:
int x;
};
class B : public A
{
public:
int y;
};
class C : public B
{
public:
int z;
};

B是否可能包含变量xy,而类C仅包含yz

我认为最接近您想要实现的是私有继承。

struct A
{
int x;
};
struct B : private A
{
int y;
};
struct C : B
{
int z;
};
int main()
{
C c;
c.x = 5; // error. you're not allowed to access members from A
c.y = 3; // ok
c.z = 4; // ok
}

所以A的数据仍然存在,但你无法从B之外访问它。

如果你想让数据在C中根本不存在,那么答案是否定的。继承就是在结构的开头有你父母的内容。

struct A
{
int x;
};
struct B : A
{
int y;
};

在内存中,B的一个实例将如下所示:

struct B
{
int x;
int y;
}

是的,可以满足您的变量继承约束。使用朋友类。通过在类声明中使用关键字friend公开的友谊语义,可以使派生类能够访问其父类的私有成员。该链接包含友谊语义的完整教程。

你的代码看起来像:

class A
{
private:
int x;
friend class B;
};
class B : public A
{
public:
int y;
};
class C : public B
{
public:
int z;
};

由此,class B可以访问class Aprivate x,但只能从class B的定义内部访问。满足变量继承约束,class B包含(并且可以使用(xy,而class C包含yz

另一种方式可以是私人继承,比如:

class A
{
private:
int x;
};
class B : private A
{
public:
int y;
};
class C : public B
{
public:
int z;
};

但这比friend方法要严格得多。选择适合您需要的。