如果基类中的虚成员函数是公有的,那么将其覆盖并私有化是否有意义?
struct base {
virtual void a();
};
struct derived : base {
// ...
private:
void a() override;
};
struct base {
virtual void a();
};
struct derived : base {
// ...
private:
void a() override;
};
是的,如果您将基类继承为私有,则会出现这种情况。否则,它更像是一种奇怪的显式限制——用户必须进行显式转换才能使用该函数——通常不建议这样做,因为很少有人能理解作者的意图。
如果您想要限制一些来自基类的函数,请进行私有/保护继承,并通过using
关键字在派生类中声明您希望受保护/公共的基础方法。
看到你的设计,我发现不能直接调用derived::a
,只能通过base
接口。
这有什么意义吗?考虑一下,一旦我们有了一个derived
实例,我们总是可以向上转型为其基类,所以给定
derived d;
虽然 d.a()
无法编译,但我们总是可以这样做:
base & b = d;
b.a(); //which actually calls derived::a
derived::a
并不是那么私有,我不建议使用这种设计,因为它可能会使用户感到困惑,但需要注意的是保留了 html 标签。derived
中的成员在 base
中也是私有的,则情况会有所改变:这时很明显它们不能直接在 base
或者 derived
之外被调用。struct base
{
void dosomething(bool x)
{
if(x)
{
do_this();
}
else
{
do_that();
}
}
private:
virtual void do_this(){}
virtual void do_that(){}
};
struct derived : base
{
private:
void do_this() override { }
void do_that() override { }
};
除非其他类扩展了base
本身,否则不能调用它们:
derived d;
d.dosomething(true); //will call do_this() in derived
d.dosomething(false); //will call do_that() in derived
d.do_that() //won't compile
struct base {
void foo() { a() ; b(); }
virtual void a() = 0;
virtual void b() = 0;
};
struct derived : base {
private:
void a() override {}
void b() override {}
};
int main()
{
derived().foo();
}
a
和 b
应该被声明为 protected
,但无论如何,derived
可以改变访问权限,并且需要一些文档说明,以便 derived
知道应该如何实现 a
和 b
。
class
和struct
之间没有任何区别。 - 463035818_is_not_a_numberprivate
,因为没有任何方法会被直接调用。然后某些风格战士会出现并说:“这应该是一个结构体,因为'blah是wotsit'”,这个规则在那个圈子之外毫无意义,初级程序员将其更改为结构体(因为风格战士只有在真正惹恼原始作者时才会自己更改东西),并放入private:
,以便它的行为相同,因为没有人想重新测试它。然后你就有了OP代码。 - Gem Taylor