C++-不希望使用基方法

C++ - unwanted use of base method

本文关键字:方法 希望 C++-      更新时间:2023-10-16

我有一个基类A和几个派生类BCD,它们都有一个方法DoSomething(),它在基类方法中是虚拟的(它在所有子类和基类中都实现)。

我有一个问题,派生类B使用基类a的方法。这可能是设计不好的结果,但我不认为有问题,因为实现非常直接。

在以下中创建的B类对象

A* a = new B();

如果我为这个对象调用方法DoSomething(),则使用基类的方法:

a->DoSomething(); //Results in Base class method being called.

但是我希望使用类B的方法。你能告诉我怎么了吗?

根据您描述的症状:

  • 或者您忘记了基类成员定义中的virtual关键字
  • 或者您在派生类中的签名存在细微差异

前进的方法是在派生类中指示该函数是覆盖:

class A { 
   ...
   virtual void DoSometing(); 
}; 
class D : public A {
   ...
   void DoSomething() override; 
};

在这种情况下,如果不匹配,您将得到一条清晰的编译器错误消息。

下面的示例实现了您所要求的。

#include <iostream>
class A
{
    public:
    virtual void DoSomething()
    {
            std::cout << "A::DoSomething" << std::endl;
    }
};
class B : public A
{
    public:
    virtual void DoSomething()
    {
            std::cout << "B::DoSomething" << std::endl;
    }
};
int main(int argc, char **argv)
{
    A *a = new B();
    a->DoSomething();
    delete(a);
    return 0;
 }

输出:

B::DoSomething