【发布时间】:2021-09-26 23:29:23
【问题描述】:
考虑以下代码:
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(和朋友)调用?
【问题讨论】:
-
你想要一个不允许基类调用的派生类函数?这不是违反里氏替换原则吗?
-
不确定你的最后一句话/问题是什么意思。在您展示的代码中,派生类
B确实实现了基类的纯虚方法。 -
我的建议是强制基类完全抽象(删除),因此行为由派生类定义。
-
@LouisGo 是的,我希望基类方法不能调用 f()。
-
另一个answer同样的问题可能也有帮助。
标签: c++ inheritance language-lawyer virtual-functions