继承和指针指针:为什么它不起作用,我该如何解决它?

时间:2010-07-27 12:03:17

标签: c++ inheritance pointers dynamic-cast

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

示例:

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
}

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:6)

请考虑以下事项:

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指针而不会出现编译器错误,并且类型系统将被破坏。动态演员无济于事,因为施法无法防止伤害。

答案 1 :(得分:2)

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

简单的解决方案是这样的:

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

答案 2 :(得分:0)

你要做的是有缺陷的。

(非常量)指针到指针的典型用例作为函数参数 - 该函数将修改参数以指向某个实例的指针。

选择实例的功能。 示例工厂方法。

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

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

因为它需要一个cFo​​o **它只能保证该对象是一个有效的cFoo。

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