我有一个基类和一个扩展它的子类。子类在父类中没有自己的方法。也就是说,在基类中将其声明为虚拟实际上并不是一种选择。
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();
我的问题是,是否有一种更清洁的方法可以做到这一点,或者是否正在逐步推进?
答案 0 :(得分:14)
我的问题是,是否有一种更清洁的方法可以做到这一点,或者是否正在逐步推进?
在这种情况下,运行时转换似乎没问题。但是,您应该使用dynamic_cast<>
而不是C风格的强制转换(如果您不确定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();
答案 1 :(得分:1)
A
没有定义任何名为myNewMethod()
的方法,因此无法调用它。
尽管我通常强烈反对施法,但确实施法是唯一的方法。
答案 2 :(得分:0)
嗯,你必须进行强制转换,但是你可以通过在函数中隐藏丑陋的强制转换语法来使代码看起来更清晰/更具可读性。
B* B_static_cast(A* item)
{
return static_cast<B*>(item);
}
A* item = new B();
B_static_cast(item)->funtion_in_B();