如何调用一个方法,该方法需要一个子类对象,其子类对象由指向其超类的指针引用?

时间:2016-10-28 20:18:50

标签: c++ casting polymorphism

我有一个指向其超类的指针引用的对象:Base* d1 = new Derived();

我想将它传递给另一个需要派生类对象的方法:void f(Derived* d);

但除非我使用类型转换,否则它不起作用。还有另一种方法可以达到这个目的吗?

以下是一个例子:

#include <stdio>
class Base {};
class Derived : public Base {};

class Client
{
   public:
   void f(Base* b) { printf("base"); };
   void f(Derived* d) { printf("derived"); };
};

int main(int argc, char* argv[])
{
   Client*  c  = new Client();
   Base*    b  = new Base();
   Base*    d1 = new Derived();
   Derived* d2 = (Derived*) d1;

   c->f(b);  // prints "base". Ok.
   c->f(d1); // prints "base"! I expected it to be "derived"!
   c->f(d2); // prints "derived". Type-casting is the only way?
}

1 个答案:

答案 0 :(得分:3)

一般来说,你可以用 dynamic_cast 做一些事情。

从另一方面来说,我相信, dynamic_cast 实际上可以通过良好的设计来避免。

在您的示例中,您可以创建基础类的 f 虚拟成员,并在 Derived 类中覆盖它。然后通过指向 Base 的指针将其命名为 f

这样的事情:

set(CMAKE_EXE_LINKER_FLAGS "/MANIFEST:NO")