派生类中的私有重写虚函数
Private overriden virtual functions in derived class
如果虚拟成员函数在基类中是公共的,那么从基类中重写的虚拟成员函数是否有意义?
struct base {
virtual void a();
};
struct derived : base {
// ...
private:
void a() override;
};
如果您被迫在实现类上进行两阶段构造(即有一个init()
方法以及或代替必须调用的构造函数(我知道,但有原因(,那么这将停止您直接在实例指针上调用任何/other/方法,然后再将其作为接口指针传递回。加倍努力,使继承私有,并让你的一个公共 init 函数返回接口指针!
另一个原因是你只是不需要/在最终的实现类声明中编写public:
,所以默认情况下一切都是私有的。但是为什么你会这样做并使用结构而不是类我不知道。也许这是由于风格战争而在某个时候从阶级转换而来的?
看看你的设计,我发现不能直接调用derived::a
,只能通过base
接口调用。
有什么意义吗?考虑一下,一旦我们有一个derived
实例,我们总是可以向上转换为它的基础,所以给定
derived d;
虽然d.a()
不会编译,但我们总是可以
base & b = d;
b.a(); //which actually calls derived::a
换句话说:毕竟,derived::a
不是那么私密,我不鼓励这种设计,这可能会让用户感到困惑。
如果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
是的,如果您将基类继承为私有。否则,它更像是一个奇怪的显式限制 - 用户必须进行显式转换才能使用该函数 - 通常不建议这样做,因为很少有人能够理解作者的意图。
如果要限制基类的某些函数,请进行私有/受保护的继承,并通过using
关键字声明要在派生类中保护/公共的基方法。
与非虚拟方法相同的推理适用:如果只有类本身应该调用它,则将其设为私有。
考虑模板方法模式:
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();
}
也许应该protected
a
和b
,但无论如何,derived
可以更改可访问性,并且需要一些文档,以便derived
知道如何实现a
和b
。
- C++调用使用重写函数的父类函数
- 重写函数不打印基类数据
- 在 c++ 中重写函数时如何选择基类?
- 为什么继承的函数忽略了在原始函数中调用的重写函数?
- 在不提供定义的情况下重写函数有什么意义?
- 建议用户使用 lambda 重写函数
- 如何创建使用重写函数的非成员函数?
- 调用重写函数并使用基类中的重载变量
- 重写函数的默认参数
- 从父级调用派生类重写函数.C++
- C++子类中的重写函数成员
- 函数中的指针不称为派生类的重写函数
- 基类数组中重写函数的使用
- 如何使用协变参数重写函数(在抽象基类中)
- c++ 调用子类而不是父类的重写函数
- C++:从模板化基类重写函数
- 使用派生类的类型重写函数参数类型
- c++仅为特定实例重写函数
- 需要一个关于用const参数重写函数的警告
- Qt/C++重写函数而不进行子类化