我正在使用一些生产代码,其中一些我无法安全地修改(不破坏内容)。我的问题是我想使用一个特定的方法,其中一个参数是指向类的指针。但是作为参数的类不能达到我想要的效果。
所以我写了一个该类的子类,并试图调用上面的函数,但它仍然使用父类的方法。
我的MWE如下:
foo = build.buildVariableResolver`.resolve("FOO")
println "FOO=$foo"
在上面的示例中运行此输出当然是:
#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;
}
我认为问题是切片?基本上我正在转向父类的指针,所以它被认为是父类。
通过在父类中创建虚拟方法但我没有那个选项,我已经看到了一些方法。
有没有办法让secondMethod实际使用这个孩子的方法?具体而言,无需更改Parent类或secondMethod。
答案 0 :(得分:0)
如果您无法更改父类或“secondMethod”,请不要这样做。 'secondMethod'的构造函数将其参数定义为Parent *。将Child *传递给'secondMethod'将导致Child *向上转换为Parent *,从而将导致Parent的'方法'实现被调用。
答案 1 :(得分:0)
如果您无法将method
更改为虚拟功能,则可以导入模板以解决问题。
template<typename T>
void secondMethod(T* Pptr)
{
Pptr->method();
}
它可以工作!!!