【问题标题】:Inheritance: use inherited methods from parent pointer继承:使用从父指针继承的方法
【发布时间】:2016-08-15 12:14:22
【问题描述】:

我正在处理一些生产代码,其中一些我无法安全地修改(不破坏东西)。我的问题是我想使用一个特定的方法,其中一个参数是指向类的指针。但是,作为参数的类并没有做我想要的。

所以我编写了该类的子类并尝试调用上述函数,但它仍然使用父类的方法。

我在下面有一个 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 实际使用孩子的方法?具体而言,无需更改 Parent 类或 secondMethod。

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

    如果您无法更改父类或“secondMethod”,则不会。 'secondMethod' 的构造函数将其参数定义为 Parent*。将 Child* 传递给“secondMethod”将导致 Child* 向上转换为 Parent*,进而导致 Parent 的“method”实现被调用。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 2019-08-31
        • 2016-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        相关资源
        最近更新 更多