2010-03-28 120 views
11

对于下面的C++程序:派生类和基类之间指针指针的转换?

class Base { }; 

class Child : public Base { }; 

int main() 
{ 
    // Normal: using child as base is allowed 
    Child *c = new Child(); 
    Base *b = c; 

    // Double pointers: apparently can't use Child** as Base** 
    Child **cc = &c; 
    Base **bb = cc; 

    return 0; 
} 

GCC产生的最后一个赋值语句以下错误:

error: invalid conversion from ‘Child**’ to ‘Base**’ 

我的问题是两个部分:

  1. 为什么没有从子**到基**的隐式转换?
  2. 我可以使这个例子与C风格演员或reinterpret_cast工作。使用这些铸件意味着扔掉所有类型的安全。有什么我可以添加到类定义,使这些指针隐式投射,或者至少短语转换的方式,允许我使用static_cast而不是?
+0

许多编程语言在这个问题上的变化是SO上最常见的问题之一。但是即使对于相同的语言,每个人的用语都略有不同,因此找到重复的内容可能很困难。 – 2010-03-28 09:33:12

+0

“固定”这个例子以避免阴影转换将取决于你为什么首先使用指针指针。 – aschepler 2012-07-24 18:52:06

回答

19

如果这是允许的,你可以这样写:

*bb = new Base; 

而且c最终会指着Base一个实例。坏。

+0

小修正 - 他可以说** ** bb = new Base();'只是'* bb'将不被允许。 – Phil 2010-03-28 09:38:54

+4

@Phil:'new'返回一个指针,它是'* Base'类型。 'bb'的类型是'** Base'。因此'* bb'是正确的解引用级别。 – Amber 2010-03-28 09:43:53

+1

基本原理与关于'char **'和'char const **'非等价的comp.lan.gc FAQ基本相同:http://c-faq.com/ansi/constmismatch.html – 2010-03-28 10:30:42

相关问题