如何在私有继承中调用派生类方法

How to call derived class method in private inheritance?

本文关键字:调用 派生 类方法 继承      更新时间:2023-10-16

下面的代码没有为我编译...

class Base
{
public:
    Base(){}
    virtual void Display()
    {
        cout << "Base Display" << endl;
    }
};
class Derived : private Base
{
private:
    void Display() override
    {
        cout << "Derived Display" << endl;
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
    Derived d;
    d.Display();
    Derived* dp = new Derived();
    dp->Display();
    delete dp;
    return 0;
}

编译器在我调用Derived::Display()时报告错误。怎么称呼呢?通过编写这样的代码,我们可以解决什么样的问题?

不能从类外部访问私有方法。 因此编译错误。

您在这里混合了两个不同的概念,成员函数的访问说明符和基类的访问说明符。

不能调用成员函数,因为它的访问说明符private,并且您正在尝试从不是友元的函数调用。这与Base的继承类型无关,也与是否存在这种关系无关。

继承关系中的访问说明符确定代码的哪些部分可以将您的类型视为Base,哪些部分不能。在这种特殊情况下,在Derived及其朋友内部,您可以使用引用或指针指向Derived,就好像它是 Base ,但不能在它之外。

怎么称呼呢?通过编写这样的代码,我们可以解决什么样的问题?

私有继承模型是通过使用第三方库/类层次结构实现的,

并且可用于通过使用第三方库/类层次结构来提供某些功能,您自己的类型不需要从概念上派生。避免公共继承会阻止用户将你视为基础,这是有意为之,因为这是实现的细节。在您自己的类型中,可以使用继承关系:

void detail(Base *base) {
    base->Display();       // Base::Display is public
}
void Derived::show() {     // Derived::show is public:
    detail(this);          // Private inheritance is visible inside Derived
}

您已经在派生类中将Display设为私有,因此可以通过指向Base,的指针/引用访问它,但不能直接在Derived对象中访问,也不能通过指向Derived的引用/指针。

// This should work:
Base *b = new Derived;
b->Display();
// and so should this:
Derived d;
Base &b = d;
b.Display();

。但其中任何一个也需要公共继承,以允许从DerivedBase的隐式转换。

您不能调用具有私有继承的派生类方法,即使它被定义为公共,它也将成为私有的。

私有继承对外部世界隐藏了每个方法和属性,因此堆或堆栈上的Derived实例无法像在主函数中那样直接调用 Display。可以将private替换为 public以避免此类错误,或者使用指向Base的指针来访问隐藏的基方法。

编辑:根据杰里的建议进行了改进。

私有继承创建了一个"contains-a"关系(它实际上类似于创建类型为Base的成员变量(。 您尝试做的是创建一个"is-a"关系,这是通过公共继承完成的。