3

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

例子:

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
}

我该如何解决这个问题?

4

3 回答 3

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

于 2010-07-27T12:19:02.650 回答
2

它不起作用,因为它dynamic_cast适用于指针或对类的引用。而且您正在尝试将它用于指向指针的指针。

简单的修复将是这样的:

func2(&dynamic_cast<cFoo*>(pbar));
于 2010-07-27T12:08:51.017 回答
0

您正在尝试做的事情是有缺陷的。

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

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

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

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

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

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

于 2010-07-27T12:45:22.580 回答