【问题标题】:c++: access derived class method when passing a pointer to the base class?c ++:将指针传递给基类时访问派生类方法?
【发布时间】: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 你的意思是在基类中还是在派生类中?还是两者兼而有之?
  • 在基类中,派生类默认继承,但也可以添加。

标签: c++ inheritance derived-class


【解决方案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();
    /* ... */
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2023-04-07
    • 2021-09-09
    • 1970-01-01
    • 2011-01-27
    • 2014-06-22
    • 1970-01-01
    相关资源
    最近更新 更多