接口实现和私有继承之间的交互
Interaction Between Interface Implementation and Private Inheritance
当一个类被私有继承时,该类的所有成员在子类中都变为私有。 但是,在下面的示例中,我们能够通过 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
继承即可。
相关文章:
- 复制和交换习惯用法与移动操作之间的交互
- 玩家移动和碰撞之间的交互问题
- C++ 和 Lua 函数之间的交互与 3D 矢量参数
- 如何在python中的PyArrow和C++中的Arrow之间进行交互时将PyArrow表转换为Arrow表
- 接口实现和私有继承之间的交互
- C++ 函数中两个类之间的交互
- QMainWindow 类和 QDialogue 类之间的交互
- 三种类型之间的隐式转换交互
- 如何在网页和实际程序之间进行交互
- ios::app 和用于输入的 fstream 之间的交互
- c++11 std::thread 和类友元函数之间的交互
- 如何在不同的cpp中生成的节点之间进行交互.
- 优化程序与专用于 what 命令的字符串之间的交互
- 为什么在node.js中,c++插件和javascript之间的交互非常昂贵
- 队列和线程池之间的交互
- 编译器差异:别名解析和名称查找之间的交互
- 对象之间的交互
- C++类和结构之间交互的语法
- 指针和类之间的交互
- 使用Qt的两个按钮和标签之间的基本交互