Как вызвать дочерний метод из родительского указателя в 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();