接口实现和私有继承之间的交互

Interaction Between Interface Implementation and Private Inheritance

本文关键字:之间 交互 继承 实现 接口      更新时间:2023-10-16

当一个类被私有继承时,该类的所有成员在子类中都变为私有。 但是,在下面的示例中,我们能够通过 AD 间接访问私有继承的 doWork 函数实现(指向使用 R 类型的指针(。

这怎么允许?虚拟查找是否忽略可见性规则,因为它是在运行时完成的?

#include <iostream>
using std::cout;
class R
{
public:
virtual void doWork() = 0;
};
class RA : public virtual R
{
public:
void doWork() { cout << "RA doWorkn"; };
};
class P : public virtual R, private RA
{
public:
P() : RA() {};
};

class AD : public virtual R, private P
{
public:
AD() : P() {};
void doWork(int k) { cout << "AD Time dowork " << k << "n";}
};
int main()
{
AD ad;
R* p = &ad;
p->doWork();
}

上面的代码将在运行时打印"RA doWork"。我的期望是它会导致运行时错误,因为由于私有继承,doWork 的定义无法从 p 访问。

AD

私下继承P但公开继承R。这在实践中意味着,在R中声明的公共方法仍然可以在AD中访问,但在P中声明但不在R中声明的公共方法在AD中将无法访问。例如,如果P看起来像:

class P : public virtual R, private RA
{
public:
P() : RA() {};
void doWorkP() { std::cout << "doWorkP" << std::endl; }
};

您可以通过AD访问doWork,但不能doWorkP

如果你想使R的方法无法访问AD只需私下从R继承即可。