如何在子类中重写时调用私有虚拟基类实现
How to call private virtual base class implementation when overriding in child class
>我有一个这样的类层次结构:
class Base
{
public:
void start() { init(); }
private:
virtual void init() = 0;
};
class Default : public Base
{
private:
virtual void init() override {/*default implementation*/};
};
class Special : public Default
{
private:
virtual void init() override final {/*specialized implementation*/};
}
如果我在Special
类型的对象上调用start()
,这工作正常;
现在我有一个案例,在Special
类的实现中,我想调用Default
类的实现。 通常这适用于Default::init();
,但由于Default
声明这是private
,因此在这里会失败。
显然,一种解决方案是将其从private
更改为protected
,但我想问一下是否有其他方法?与其允许任何子函数直接调用此函数,我想将其限制为通过已在Base
或Default
类中定义的虚函数发起的调用。
是否有一些选项或修饰符允许仅允许从子类调用成员函数,如果它们位于(相同(覆盖虚拟成员函数内?
>C++没有提供直接实现此目的的方法,因此您必须解决此问题,例如在下面的代码段中。
好吧,如果你绝对愿意的话。我个人宁愿回到保护函数,记录它们的用途和调用时间,然后相信派生类会正确地完成这些工作。最终,这可以使接口保持干净,并且不依赖于相当不寻常(也许是丑陋(的模式(实际上传递了两次this
(。
class Base
{
public:
virtual ~Base() { }
void start()
{
InitProxy p(*this);
init(p);
}
protected:
class InitProxy
{
public:
InitProxy(InitProxy const&) = delete;
void init()
{
m_base.Base::init(*this);
}
private:
friend class Base;
Base& m_base;
InitProxy(Base& base)
: m_base(base)
{ }
};
private:
virtual void init(InitProxy& proxy) { }
};
class Derived : public Base
{
void init(InitProxy& proxy) override
{
proxy.init();
}
};
如果要将此约束应用于多个函数,则可以让代理接受成员函数指针,这样就不必为每个函数单独重写代理。如果函数参数不同,您可能需要从那时起制作一个模板。
向前声明Special
,并使其成为Default
的朋友:
class Base
{
public:
void start() { init(); }
private:
virtual void init() = 0;
};
class Special; // Forward declaration
class Default : public Base
{
private:
virtual void init() override {/*default implementation*/}
friend class Special; // Friend declaration
};
class Special : public Default
{
private:
virtual void init() override final {
Default::init();
/*Other implementation*/
}
};
相关文章:
- 子类地址等于虚拟基类地址?
- 虚拟基类函数中派生类的大小
- 虚拟基类初始化
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 返回纯虚拟基类的向量的元素
- std::is_base_of和虚拟基类
- 如何在子类中重写时调用私有虚拟基类实现
- 从两个不同类继承的非虚拟基类的访问成员
- 为什么必须由最派生的类构建虚拟基类
- 虚拟基类的派生类列表
- boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型
- 虚拟基类和继承
- (为什么)纯虚拟派生类中是否需要虚拟基类构造函数调用?
- 在派生类中使用虚拟基类的受保护的CTOR
- 私有非虚拟基类函数被称为派生类中的函数
- 虚拟基类的创建顺序
- 使用虚拟基类C++向下转换
- 为什么在派生最多的类的初始值设定项列表中显式调用虚拟基类构造函数的规则,而较老的祖先已经拥有它?
- 虚拟与纯虚拟基类函数并从DLL导出
- 在多级继承中派生的虚拟基类会发生什么