Как вызвать дочерний метод из родительского указателя в c++?
у меня есть базовый класс и производный класс расширяет его. Дочерний класс имеет свой собственный метод, что родительский класс не имеет. То есть объявление его виртуальным в базовом классе на самом деле не является вариантом.
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();
мой вопрос в том, есть ли более чистый способ сделать это, или бросает путь к идти?
3 ответов
мой вопрос в том, есть ли более чистый способ сделать это, или кастинг путь идти?
в этом случае время выполнения, кажется, в порядке. Однако вместо слепков в стиле 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();