15

我有一个基类和一个扩展它的子类。子类有自己的方法,而父类没有。也就是说,在基类中将其声明为虚拟并不是一个真正的选择。

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();

我的问题是,有没有一种更清洁的方式来做到这一点,或者正在寻找要走的路?

4

3 回答 3

18

我的问题是,有没有一种更清洁的方式来做到这一点,或者正在寻找要走的路?

在这种情况下,运行时强制转换似乎没问题。但是,您应该使用而不是 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();
于 2013-03-10T18:58:06.230 回答
1

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

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

于 2013-03-10T18:57:14.980 回答
1

好吧,您必须进行转换,但您可以通过将丑陋的转换语法隐藏在函数中来使代码看起来更清晰/更具可读性。

B* B_static_cast(A* item)
{
     return static_cast<B*>(item);
}

A* item = new B();
B_static_cast(item)->funtion_in_B();
于 2017-08-08T18:59:06.540 回答