基类和私有继承的指针
Pointer to base class and private inheritance
下面的简单示例将产生编译器错误,因为我不小心使用了私有继承:
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*的转换中需要它?
在B
和B
的朋友之外,B
是一个 A
的简单事实是不可见的。这不是隐藏成员变量或成员函数,而是隐藏关系本身。这就是为什么从main
中你不能将new B
的结果与指向A
的指针绑定,因为就main
而言,B
不是A
(就像你不能做A * p = new unrelated;
一样)
至于为什么需要它,答案是完全相同的:因为没有访问关系,编译器不知道(好吧,它知道,但不会告诉你)如何在B
中获得一个指向A
主题的指针,因为就它所能看到的上下文中,A
和B
之间根本没有关系。
从B*
到A*
的转换
是不可访问的,因为基类子对象是私有的。当您将B*
转换为A*
时,返回指向基类子对象的指针。后者必须是可访问的,才能使转换可访问。在B
的友元函数中,转换变得可访问。顺便说一下,您总是可以通过显式强制转换来访问转换。
A* p = (A*)(new B);
注意,在某些情况下,只需要可访问转换,但在某些情况下,要求A
是B
的public(强于可访问)基。例如,当您尝试用catch(A&)
捕获B
类型的异常时,需要A
是B
的public基类。
由于基类的引用或指针不能指向继承类的对象,这是否意味着受保护的私有继承与多态性无关?
由于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
- 关于C++中具有多重继承"this"指针的说明
- 共享指针继承,而不先显式强制转换
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- 使用智能指针附加的继承对象的深层复制
- 嵌套类、继承和C++中的共享指针
- 删除C++中的继承类指针数组
- 具有虚拟指针和继承的 CPP 类大小
- 钻石继承虚拟成员铸造与指针
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- cppyy 继承包含智能指针的类
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 是否可以将成员作为指针继承
- C++14 不能调用从唯一指针继承的类的复制构造函数或运算符 =
- 是无限的Typedef函数指针继承
- 是否可以从 C++11 智能指针继承并覆盖相关运算符?
- 继承:使用从父指针继承的方法
- 使用智能指针继承的皮条
- 是覆盖返回类型所需的指针-继承
- 调用未从BaseClass指针继承的DerivedClass函数