在基类中公开使用函数,在派生类中私有使用

时间:2019-02-14 22:49:09

标签: c++ inheritance

我在父类中有一个函数public void myFunction(foo);public void myFunction(foo, bar);。我希望这些函数包含在派生类中,但要私下处理。您可以通过using BaseClass::myFunction()在派生类的私有部分中声明它。请注意,该函数中不包含任何参数。但是,如果像我的情况那样有myFunction的两种实现,它将无法工作,因为它无法区分这两个函数。如何私下实现这两个功能?

1 个答案:

答案 0 :(得分:0)

基于您对教授关于使用继承的说明的评论,我认为您不应该使用私有继承。

私有继承是C ++的有效功能,但通常不是一个好的设计选择。我不愿赘述,我一般不建议这样做,我将让您在SO的其他地方查找它,但还建议Scott Meyer的书《有效的C ++及更有效的C ++》对此进行了介绍。

(另一方面,受保护的继承很不寻常)

在您的问题中,您似乎从公共继承开始,并试图通过使用将某些继承的功能设为私有。如评论中所述,这是一个糟糕的设计选择。它违反了Liskov替代原则。由于PUBLIC继承隐含为-a,我们可以想象创建对派生类型的对象的基类引用的代码,当我们尝试用该基类引用调用隐藏功能时,会发生什么?

Derived d;
Base& b = d;
b.HiddenFunction(); // calling the function on d even though you thought you hid it

如果改为使用私有继承,则可以使用来公开可以安全地在派生类上公开的那些私有继承的函数。

class OrderedLinkedList : private LinkedList
{
     public:
     using LinkedList::ItemCount;  // expose some specific base functionality
};

如果使用由于重载函数而无法完成工作,则可以仅添加要提供的重载并仅通过调用基本函数来实现它们。在这种情况下,如果您需要澄清是调用基本版本还是派生版本,则可以在函数名称前加上类名称,例如

void SomeFunction()
{
    // call base version, not this derived version recursively
    NameOfBaseClass::SomeFunction();
}

在派生类的实现中,(私有)继承的基类的公共成员和受保护成员都可以访问,而无需执行任何操作,例如添加using。

私有继承不是像公共继承那样的is-a关系,因为我们不能将派生对象引用为基础的引用/指针。私有继承是“用术语实现的”。

由于私有继承不是is-a,因此无法将此类派生对象替换为基,因此liskov替换原理就不适用。

相关问题