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

C++ 如何调用一个方法,该方法需要一个子类对象和一个指向其超类的指针所引用的子类对象?,c++,casting,polymorphism,C++,Casting,Polymorphism,我有一个被指向其超类的指针引用的对象:Base*d1=new-Derived() 我想把它传递给另一个需要派生类对象的方法:void f(派生*d) 但除非我使用类型转换,否则它不起作用。有没有其他方法可以做到这一点 以下是一个例子: #include <stdio> class Base {}; class Derived : public Base {}; class Client { public: void f(Base* b) { printf("base")

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

我想把它传递给另一个需要派生类对象的方法:
void f(派生*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?
}
#包括
类基{};
派生类:公共基{};
类客户端
{
公众:
void f(Base*b){printf(“Base”);};
void f(派生*d){printf(“派生”);};
};
int main(int argc,char*argv[])
{
Client*c=新客户端();
Base*b=新的Base();
Base*d1=新派生的();
派生*d2=(派生*)d1;
c->f(b);//打印“base”。好的。
c->f(d1);//打印“base”!我希望它是“派生的”!
c->f(d2);//打印“派生”。类型转换是唯一的方法吗?
}

一般来说,您可以使用动态\u cast做一些事情

从另一方面来说,我相信,好的设计几乎总是可以避免这种动态投射

在您的示例中,您可以使函数f成为基类的虚拟成员,并在派生类中重写它。然后通过指向Base的指针将其称为f

大概是这样的:

class Base {
    public:
        virtual void f() {
            printf("Base\n");
        }
};

class Derived : public Base {
    public:
        virtual void f() {
            printf("Derived\n");
        }
};

class Client
{
   public:
       void f(Base* b) {
           b->f();
       };
};

您可以向Base添加一个名为call_f的虚拟函数,该函数将使用Base中的“this”指针调用f,然后在派生函数中重写它以执行相同的操作。无论是这样还是那样,目前都很难回答。你想解决的问题是什么?你对动态演员阵容感到烦恼吗?@长颈鹿船长他说他不想求助于演员阵容,如果有办法摆脱它的话。@长颈鹿船长,我会这么想。他有一个函数,它把一个指针指向派生的,他想调用它,但他有一个基指针。我建议将调用移到Base/Derived的成员函数中,这样可以避免强制转换。