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

时间:2013-09-30 17:01:47

标签: c++

下面的代码不是为我编译的......

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()时编译器报告错误。怎么称呼它? 我们可以通过编写这样的代码来解决哪些问题?

6 个答案:

答案 0 :(得分:4)

您无法从课堂外访问私有方法。因此编译错误。

答案 1 :(得分:3)

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

您无法调用成员函数,因为其访问说明符为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 } 之外。

  

怎么称呼它?我们可以通过编写这样的代码来解决哪些问题?

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

{{1}}

答案 2 :(得分:2)

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

// This should work:
Base *b = new Derived;
b->Display();

// and so should this:
Derived d;
Base &b = d;
b.Display();

...但其中任何一项都需要公开继承才允许从Derived隐式转换为Base

答案 3 :(得分:1)

您不能使用私有继承调用派生类方法,即使将其定义为public,也会变为私有。

答案 4 :(得分:0)

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

编辑:改进了Jerry的建议。

答案 5 :(得分:0)

私有继承创建“包含 - ”关系(它实际上类似于创建类型为Base的成员变量)。你试图做的是创建一个“is-a”关系,这是通过公共继承来完成的。