首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用期望子类对象具有指向其超类的指针引用的子类对象的方法?

如何调用期望子类对象具有指向其超类的指针引用的子类对象的方法?
EN

Stack Overflow用户
提问于 2016-10-28 20:18:50
回答 1查看 52关注 0票数 1

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

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

但除非我用模特儿,否则就没用了。还有其他方法可以做到这一点吗?

下面是一个示例:

代码语言:javascript
复制
#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?
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-28 20:29:29

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

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

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

就像这样:

代码语言:javascript
复制
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();
       };
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40312661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档