私有继承用法如“中所述”;C++;程序设计语言; 在C++程序设计语言中,第四版,在<20.5.2“访问基类”(第605页),它说(关于私有继承):

私有继承用法如“中所述”;C++;程序设计语言; 在C++程序设计语言中,第四版,在<20.5.2“访问基类”(第605页),它说(关于私有继承):,c++,inheritance,private-inheritance,C++,Inheritance,Private Inheritance,private在通过限制 与基础的接口,以便能够提供更强大的保证 例如,B是向量Z的一个实现细节 将类型检查添加到向量基的指针模板的 第25.3节中的内容就是一个很好的例子 现在还不清楚比亚恩·斯特罗斯图普在这里想说什么。如何通过将“接口”限制为基来定义类?他所说的“更有力的保证”是什么意思?让我们举一个非常简单的例子: // A simple class with a *public* member class A { public: int a; }; // Use private

private在通过限制 与基础的接口,以便能够提供更强大的保证 例如,B是向量Z的一个实现细节 将类型检查添加到向量基的指针模板的 第25.3节中的内容就是一个很好的例子


现在还不清楚比亚恩·斯特罗斯图普在这里想说什么。如何通过将“接口”限制为基来定义类?他所说的“更有力的保证”是什么意思?

让我们举一个非常简单的例子:

// A simple class with a *public* member
class A
{
public:
    int a;
};

// Use private inheritance
class B : private A
{
public:
    int b;
};

// Use public inheritance
class C : public A
{
public:
    int c;
};

// ...

B my_b;
my_b.a = 0;  // Invalid, the member a is private due to the private inhericance

C my_c;
my_c.a = 0;  // Valid, because the inheritance is public

private
继承限制对基类成员的访问。即使
A::A
成员变量是
public
,由于
private
继承,它在子类
B

中变为
private
,让我们举一个非常简单的例子:

// A simple class with a *public* member
class A
{
public:
    int a;
};

// Use private inheritance
class B : private A
{
public:
    int b;
};

// Use public inheritance
class C : public A
{
public:
    int c;
};

// ...

B my_b;
my_b.a = 0;  // Invalid, the member a is private due to the private inhericance

C my_c;
my_c.a = 0;  // Valid, because the inheritance is public
private
继承限制对基类成员的访问。即使
A::A
成员变量是
public
,由于
private
继承,它在子类
B
中变为
private

如何通过将“接口”限制为基来定义类

通过将遗产私有化。当继承是私有的时,基类的接口仅限于成员函数,在外部不可用。访问说明符可以在基列表中给出:

class A : private B
//        ^^^^^^^
他所说的“更有力的保证”是什么意思

非基地提供的任何担保,或基地提供的担保的超集


例如,“行为总是定义良好”的保证比“只有在输入不为空时行为才定义良好”的保证更有力。另一个示例:“函数不抛出”强于“除非复制构造函数抛出,否则函数不会抛出”

如何通过将“接口”限制为基来定义类

通过将遗产私有化。当继承是私有的时,基类的接口仅限于成员函数,在外部不可用。访问说明符可以在基列表中给出:

class A : private B
//        ^^^^^^^
他所说的“更有力的保证”是什么意思

非基地提供的任何担保,或基地提供的担保的超集


例如,“行为总是定义良好”的保证比“只有在输入不为空时行为才定义良好”的保证更有力。另一个示例:“函数不抛出”比“除非复制构造函数抛出,否则函数不会抛出”强。向量只是
T
s的容器。现在,假设您希望构建一个行为类似于向量的类型,但添加了一些额外的运行时检查。我现在手头上没有TC++PL的副本,所以让我们做一个约束:例如,假设向量只允许包含偶数。尝试插入奇数将导致运行时错误。让我们调用这个新类
偶数向量
,以及没有运行时检查的版本
基本向量

even_vector
base_vector
提供更强的运行时保证:它保证其所有元素都是偶数

假设您的
base\u vector
被设计为可以很好地作为基类工作(而
std::vector
通常不这样做),您现在可能会尝试使用公共继承来实现
甚至是
base\u vector
。毕竟,功能是相同的,您只需在
基本向量
提供的功能之上的
偶数向量
案例中进行一些额外的运行时检查。但是,如果在此处使用公共继承,则会违反以下规则:无论在哪里使用
基向量,都不能使用
偶数向量
。特别是,在向
基向量
中插入奇数的情况下,
偶数向量
将中断。这是不好的,因为现在为
base_vector
编写的所有代码都必须考虑到这样一个事实,即一些
base_vector
s不能处理奇数

对于私有继承,您没有这个问题:
偶数向量
继承自
基向量
,这是实现的一个细节。客户机不能使用
甚至是
,因为需要
基向量,所以上面的问题不会发生,但我们仍然可以获得代码重用的好处


也就是说,使用私有继承进行代码重用是许多人不鼓励的做法。可以说更好的方法是,将私有
base_vector
成员添加到
偶数_vector
。这种方法的优点是,它严重减少了两个类之间的耦合,因为
即使是
也不再能够访问
基本
的任何非公共部分。让我们继续使用向量的示例。向量只是
T
s的容器。现在,假设您希望构建一个行为类似于向量的类型,但添加了一些额外的运行时检查。我现在手头上没有TC++PL的副本,所以让我们做一个约束:例如,假设向量只允许包含偶数。尝试插入奇数将导致运行时错误。让我们调用这个新类
偶数向量
,以及没有运行时检查的版本
基本向量

even_vector
base_vector
提供更强的运行时保证:它保证其所有元素都是偶数