如何从父指针调用子方法

How to call child method from a parent pointer?

本文关键字:调用 子方法 指针      更新时间:2023-10-16

我有一个基类和一个扩展它的子类。子类拥有父类所没有的自己的方法。也就是说,在基类中将其声明为virtual实际上并不是一种选择。

class A {
  public:
    virtual void helloWorld();
};
class B : public A {
  public:
    virtual void helloWorld();
    void myNewMethod();
};

然后,在我的实现中,我有一个指向a的指针,我把它构造为B:

// somewhere in a .cpp file
A* x;
x = new B();
x->myNewMethod(); // doesn't work

我当前的解决方案是强制转换它:

((B *)x)->myNewMethod();

我的问题是,是否有一种更干净的方法来做到这一点,或者是铸造的方式?

我的问题是,是否有一种更干净的方法来做到这一点,或者是铸造的方式?

在这种情况下,运行时强制转换似乎没有问题。但是,比起c风格的强制转换,您应该使用dynamic_cast<>(如果您不确定x是否实际上指向B类型的对象):
B* pB = dynamic_cast<B*>(x); // This will return nullptr if x does not point
                             // to an object of type B
if (pB != nullptr)
{
    pB->myNewMethod();
}

另一方面,如果您确定x指向B类型的对象,那么您应该使用static_cast<>:

B* pB = static_cast<B*>(x);
pB->myNewMethod();

A没有定义任何称为myNewMethod()的方法,因此不能调用它。

尽管我通常强烈反对使用强制类型转换,但这里强制类型转换确实是唯一的方法

好吧,你必须进行强制转换,但是你可以通过在函数中隐藏难看的强制转换语法来使代码看起来更干净/更可读。

B* B_static_cast(A* item)
{
     return static_cast<B*>(item);
}
A* item = new B();
B_static_cast(item)->funtion_in_B();