C++ 在基类中公开使用函数,在派生类中私下使用函数

C++ 在基类中公开使用函数,在派生类中私下使用函数,c++,inheritance,C++,Inheritance,我有一个函数public void myFunction(foo)和公共void myFunction(foo,bar)在我的父类中。我希望这些函数包含在我的派生类中,但不公开。您可以通过使用BaseClass::myFunction()在派生类的private部分声明它。请注意,它不接受函数中的任何参数。但是,如果有两个myFunction的实现,就像我在本例中所做的那样,它将无法工作,因为它无法区分这两个函数。如何私下实现这两个功能?根据您在评论中对教授使用继承的指导所说的,不仅仅是它是否是

我有一个函数
public void myFunction(foo)和<代码>公共void myFunction(foo,bar)在我的父类中。我希望这些函数包含在我的派生类中,但不公开。您可以通过
使用BaseClass::myFunction()
在派生类的private部分声明它。请注意,它不接受函数中的任何参数。但是,如果有两个
myFunction
的实现,就像我在本例中所做的那样,它将无法工作,因为它无法区分这两个函数。如何私下实现这两个功能?

根据您在评论中对教授使用继承的指导所说的,不仅仅是它是否是一个好的设计选择,我认为您应该使用私有继承

私有继承是C++的一个有效特征,但它往往不是一个好的设计选择。我不会去讨论这个问题,我一般不会推荐它,我会让你在别处查找它,但是也推荐Scott Meyer的书,有效的C++和更有效的C++,它涵盖了这个。 (另一方面,受保护的继承非常罕见)

在您的问题中,您似乎从公共继承开始,并试图通过使用将某些继承的功能设置为私有。正如评论中提到的,这是一个糟糕的设计选择。它违反了利斯科夫替代原则。由于公共继承意味着is-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();
}
在派生类实现中,可以访问(私有)继承基类的公共成员和受保护成员,而无需执行任何操作,如使用添加

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


由于私有继承不是is-a,因此不能用此类派生对象替换基对象,因此liskov替换原则不适用。

你想阻止什么?我没有答案,但我要说的是,这种方法(如果你能让它工作的话)可能会非常混乱,并且不是使用继承的预期方式。你到底想做什么?你可以做一个
private
继承而不是
public
继承,就像这样:
class-Derived:private-Base{}。在派生类的上下文中,它会将所有内容的可见性从基类更改为私有类。但我认为我从未见过一个有效的非公共继承用例。你想做的是一种私有继承用例,但它违反了Liskov替换原则(SOLID rules中的字母L)。我认为最好为
LinkedList
OrderedLinkedList
提取公共基类,这样就不需要这样的诡计,但是如果你的作业要求
OrderedLinkedList
LinkedList
派生,那么你就必须忽略好的编程风格。@Yksisarvinen-Heh,也许吧。虽然,我想我的教育机构还不错,我在这里:d