c++ - 抽象基类中私有虚函数的可见性
问题描述
考虑以下代码:
class A {
public:
virtual void f() const = 0;
void callf() const { f(); }
};
class B : public A {
virtual void f() const { }
};
int main()
{
B x;
x.callf();
return 0;
}
类B
派生自抽象基类A
,但将实现的方法“隐藏”f()
为私有成员。尽管如此,继承的成员callf()
仍然可以调用f()
在基类中是公共的。该代码在 g++ 10.1.0 和 clang++ 11.1.0 上编译时没有警告。
这是一个法律代码,即继承者callf()
是否正确看到了私有成员f()
?
或者,派生类是否有可能B
实现基类的纯虚方法,这样它们只能由B
(和朋友)调用?
解决方案
这是一个合法的代码,即继承的 callf() 是否正确地看到了私有成员 f()?
是的,这是合法的代码。从编译器的角度来看,callf
函数引用了它自己的类的f
函数;这是一个虚函数这一事实不会影响范围(或可访问性)——只影响实现,它将以调用 v-table 条目的形式出现。该 v-table 条目将在运行时正确解释,当它通过派生类调用时。
推荐阅读
- svnsync - svnsync 与源存储库密码
- c# - 如何使人物面对行进方向?
- android - SQLite:每秒插入 1 个值还是每分钟插入多个值?
- python - 如何对作为完成模型中外键的特定客户端的所有完成求和?
- javascript - 如何使用正则表达式解析名字、姓氏、中间名和后缀
- html - html和html5的基本区别是什么
- javascript - 如果显示的 tr 的数量小于 n,则隐藏 tbody
- shell - 没有从 Gitlab CI 中的 shell 脚本获取输出
- html - 如何将伪元素嵌套在scss中的另一个伪元素中
- html - 将按钮添加到angularjs中的表头