当我使用指向继承类的指针调用基类函数时,为什么会出现编译错误?
示例:
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
}
我该如何解决这个问题?
答案 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 **参数。
因为它需要一个cFoo **它只能保证该对象是一个有效的cFoo。
在当前形式中,如果强制进行强制转换,则会导致任何类型的cFoo暴露为cBar - 即使不是这种情况。