【问题标题】:Inheritance and pointers to pointers: why doesn't it work and how do I get around it?继承和指向指针的指针:为什么它不起作用以及如何解决它?
【发布时间】:2010-07-27 12:03:17
【问题描述】:

当我使用指向继承类的指针调用基类函数时,为什么会出现编译错误?

例子:

class cFoo {};
class cBar : public cFoo {};
void func1(cFoo *) {}  // base class
void func2(cFoo **) {}  // base class

void main(void)
{   cBar bar, *pbar;   // inherited class

    func1(&bar);   // compiles OK
    func2(&pbar);  // fail
    func2(dynamic_cast<cFoo**>(&pbar));  // 'class cFoo ** ' : invalid target type for dynamic_cast
}

我该如何解决这个问题?

【问题讨论】:

    标签: c++ inheritance pointers dynamic-cast


    【解决方案1】:

    考虑以下几点:

    class cFoo {};
    class cBar : public cFoo {};
    void func1(cFoo *) {}
    void func2(cFoo **p) { *p = new cFoo; }  // modify pointee
    
    void main(void)
    {   cBar bar, *pbar;   // inherited class
    
        func1(&bar);   // compiles OK
    
        func2(&pbar);
    }
    

    如果这样可行,您将设法将 cFoo 对象放入 cBar 指针中而不会出现编译器错误,并且类型系统将被颠覆。动态施法无济于事,因为施法无法防止损坏。

    【讨论】:

      【解决方案2】:

      它不起作用,因为dynamic_cast 适用于类的指针或引用。而你正试图在指向指针的指针上使用它。

      简单的修复方法如下:

      func2(&dynamic_cast<cFoo*>(pbar));
      

      【讨论】:

      • 这不是拿临时地址吗?真的允许吗?
      • @Anders 那么dynamic_cast&lt;cFoo*&amp;&gt; 呢?
      【解决方案3】:

      你试图做的事情是有缺陷的。

      (非 const)指向指针的指针作为函数参数的典型用例是函数将修改参数以指向某个实例的指针。

      它是选择实例的函数。 工厂方法示例。

      参数的类型描述了函数保证有效的类型。

      如果您的函数保证实例是 cBar,那么它应该采用 cBar** 参数。

      因为它需要一个 cFoo**,所以它只保证对象是一个有效的 cFoo。

      在当前形式中,如果您强制进行强制转换,您将导致任何类型的 cFoo 暴露为 cBar - 即使不是这种情况。

      【讨论】:

      • 是的,我有点怀疑这是问题所在。我不能指望 func2() 知道它正在传递一个 cBar**。在现实生活中,我所做的正是 TomW 上面显示的(分配内存)。叹息......我可以解决它,但它不会那么优雅。感谢大家的及时和专家帮助。
      猜你喜欢
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 2016-09-02
      • 2011-02-18
      • 1970-01-01
      • 2018-08-10
      • 2017-11-06
      • 1970-01-01
      相关资源
      最近更新 更多