2010-07-27 47 views
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 
} 

如何解决此得到什么?

回答

2

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

简单的解决将是这样的:

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

这不是暂时的地址吗?这是真的吗? – 2010-07-27 12:11:16

+1

@Anders那么'dynamic_cast '然后呢? – 2010-07-27 13:24:29

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的对象为C杆指针没有编译器错误,并且类型系统将被破坏。动态演员阵营将无济于事,因为演员无法阻止伤害。

0

你试图做的是有缺陷的。

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

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

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

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

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

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

+0

是的,我怀疑这是问题。我不能指望func2()知道它正在传递一个cBar **。在现实生活中,我正在做TomW上面显示的内容(分配内存)。 叹息......我可以解决它,但它不会那么优雅。 谢谢大家的及时和专家的帮助。 – Pierre 2010-07-27 14:36:36

相关问题