2016-04-22 99 views
0

我正在使用一些生产代码,其中一些生产代码我无法安全地修改(不会破坏事物)。我的问题是,我想使用一个特定的方法,其中的一个参数是指向一个类的指针。然而,类作为参数不会做我想要的。继承:使用父指针的继承方法

所以我写了这个类的一个子类,试图调用上面的函数,但它仍然使用父类的方法。

我有以下MWE:

#include <iostream> 

class Parent 
{ 
public: 
    Parent() {}; 
    void method() {std::cout<<"in Parent\n";} 
}; 

class Child : public Parent 
{ 
public: 
    Child() {}; 
    void method() {std::cout<<"in Child\n";} 
}; 

void secondMethod(Parent* Pptr) 
{ 
    Pptr->method(); 
} 

int main() 
{ 
    Child c = Child(); 
    Parent* parentPtr = &c; 

    c.method(); 
    parentPtr->method(); 

    secondMethod(parentPtr); 
    secondMethod(&c); 

    return 0; 
} 

在上面的例子中运行这个输出是当然的:

in Child 
in Parent 
in Parent 
in Parent 

我相信问题是切?基本上我是投射到父类的指针,所以它被认为是父类。

我已经看到了通过在父类中创建虚拟方法的方法,但是我没有这个选项。

有没有什么办法让secondMethod实际使用孩子的方法?具体而言,无需更改父类或第二个方法。

回答

0

不,如果你不能改变父类或'secondMethod',那不是真的。 'secondMethod'的构造函数将其参数定义为Parent *。将孩子*传递给'secondMethod'会导致Child *被上传到Parent *,从而导致调用Parent的'method'实现。

0

如果您不能将method更改为虚拟功能,则可以导入模板来解决您的问题。 template<typename T> void secondMethod(T* Pptr) { Pptr->method(); } 它可能可以工作!