基类和私有继承的指针

Pointer to base class and private inheritance

本文关键字:指针 继承 基类      更新时间:2023-10-16

下面的简单示例将产生编译器错误,因为我不小心使用了私有继承:

main.cpp:21: error: ' A '是' B '不可访问的基数

class A
{

};
class B : /*ups forgot that -> public*/ A
{

};
int main(int , char *[])
{
    A* test = new B;
    return 0;
}

你能帮我解释一下基类中究竟什么是不可访问的,为什么在从B*A*的转换中需要它?

私有继承意味着对于除了B(和B的朋友)之外的所有人,B都不是从a派生的。

你能帮我解释一下基类中究竟什么是不可访问的,为什么在从B*到A*的转换中需要它?

BB的朋友之外,B 是一个 A的简单事实是不可见的。这不是隐藏成员变量或成员函数,而是隐藏关系本身。这就是为什么从main中你不能将new B的结果与指向A的指针绑定,因为就main而言,B不是A(就像你不能做A * p = new unrelated;一样)

至于为什么需要它,答案是完全相同的:因为没有访问关系,编译器不知道(好吧,它知道,但不会告诉你)如何在B中获得一个指向A主题的指针,因为就它所能看到的上下文中,AB之间根本没有关系。

B*A*的转换 是不可访问的,因为基类子对象是私有的。当您将B*转换为A*时,返回指向基类子对象的指针。后者必须是可访问的,才能使转换可访问。在B的友元函数中,转换变得可访问。顺便说一下,您总是可以通过显式强制转换来访问转换。

A* p = (A*)(new B);

注意,在某些情况下,只需要可访问转换,但在某些情况下,要求AB的public(强于可访问)基。例如,当您尝试用catch(A&)捕获B类型的异常时,需要ABpublic基类。

由于基类的引用指针不能指向继承类的对象,这是否意味着受保护的私有继承与多态性无关?

由于B继承自A,因此A的默认构造函数将在B的构造函数之前被调用,但由于它是私有的且不继承给B,因此会得到编译器错误。

Public/private继承等同于Public/private成员变量

转换的结果是对派生类对象的基类子对象的引用。

我认为可访问性是指派生类对象的基类子对象的可访问性。对于客户端,只有当我们使用公共继承时,基类子对象才是可访问的。对于派生类的成员函数,无论使用public/protected/private继承,基类的子对象都是可访问的。

class A{
};
class B: private  A{
private:
    int* m_pb;
public:
    B(){m_pb=new int(10)};
    void func()
    {
        A* pa= new B;      //OK
        int *pmb = m_pb;   //OK 
    }
};
int main()
{
    B* pb = new B;
    A* pa= pb;             // inaccessible
    int *pmb = pb->m_pb;   // inaccessible 
}

OK。我的意思是公有/私有继承等价于公有/私有成员变量。

参考:http://pic.dhe.ibm.com/infocenter/ratdevz/v8r5/index.jsp?topic=%2Fcom.ibm.tpf.toolkit.compilers.doc%2Fref%2Flangref_os390%2Fcbclr21011.htm