c ++:将指针传递给基类时访问派生类方法?

Posted

技术标签:

【中文标题】c ++:将指针传递给基类时访问派生类方法?【英文标题】:c++: access derived class method when passing a pointer to the base class? 【发布时间】:2014-05-14 08:39:21 【问题描述】:

我为这个小白问题道歉,但我刚刚开始使用面向对象的范例编程。

我有一个函数,它接受一个指向类 void foo(myClass* C) 的指针,而这个类有它自己的方法

      class myClass
      public:
          double fooMethod();
          /* ... */
      

现在我想将一个带有重载方法fooMethod 的对象传递给foo,所以我想创建一个派生类

      class myDerivedClass : public myClass
      public:
          double fooMethod(); // overloaded method
          /* ... */
      

问题是,如果我实例化一个对象myDerivedClass* D = new myDerivedClass 并将它传递给foo(D),这个函数将使用基类的方法,即myClass::fooMethod(),而我希望它使用myDerivedClass::fooMethod()

我该如何做到这一点?我有这个问题,因为我不想重写已经工作的代码,比如foomyClass,但我想使我的新功能适应当前的代码结构。

非常感谢! L.

【问题讨论】:

你必须声明你的方法是虚拟的。 @Kiroxas 你的意思是在基类中还是在派生类中?还是两者兼而有之? 在基类中,派生类默认继承,但也可以添加。 【参考方案1】:

你可以这样做

class myClass
  public:
      virtual double fooMethod();
      /* ... */
  

class myDerivedClass : public myClass
  public:
      double fooMethod() override; // override  method, not overload
      /* ... */
  

那么如果你传递一个myDerivedClass对象指针/引用,并用它来调用fooMethod()myDerivedClass中的overriden方法就会被调用。

概念是你可以override基类方法,而不是overload

【讨论】:

谢谢!那是解释性的! @Barmaley.exe【参考方案2】:

在面向对象编程中,为了在调用基类方法时执行派生类方法,您需要该方法为virtual。在某些语言(如 Java)中,默认情况下所有方法都是虚拟的,但在 C++ 中,您必须在基类的方法定义中手动添加关键字 virtual,如下所示:

class myClass
public:
    virtual double fooMethod();
    /* ... */

【讨论】:

以上是关于c ++:将指针传递给基类时访问派生类方法?的主要内容,如果未能解决你的问题,请参考以下文章

C ++:将void *转换为基类指针时访问冲突

通过基类指针C++访问派生类的成员

将派生类的对象传递给基类

虚函数和基类中的this指针的问题!

C++继承,发送一个指向基类的指针

无法将参数 1 从派生指针转换为基类指针引用