【问题标题】:What's the right way to implement virtual function in some derived classes?在某些派生类中实现虚函数的正确方法是什么?
【发布时间】:2025-12-18 07:50:02
【问题描述】:

我有一个抽象类A,其中包含一个纯虚方法

class A
{
 public:
   virtual A* doWork() = 0;
}

我有两个派生自类A 的类(它们不是抽象类)。 需要在这两个类中实现纯虚函数doWork()

但我只想在一个类中实现这个功能(例如B类),这两个类必须派生自A

class B :public A
{
  A* doWork()
  {
    A* a = new B();
    // do some work
    return a;
  }
}

当我在 C 类中调用 doWork() 时,我想要打印一些文本,说明此功能未在此处实现。

class C : public A
{
  A* doWork()
  {
    // I want just to print some text and I don't want          
    // to return anything.
  }
}

我试图抛出一个错误,但这不是我想要做的。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 如果调用者可以处理null,您可以只打印警告并返回null
  • B:: 不应出现在 B 中。 C 也一样。它是class,而不是Class

标签: c++ oop c++11


【解决方案1】:

一个选项,挑战使类 A 抽象的前提,假设您可以控制它:不要使类 A 抽象并在那里实现默认函数。你必须返回一些东西,但它可能是一个空指针。类 A 中函数的输出将表明该函数尚未实现,这将是准确的。

class A
{
 public:
        virtual A* doWork() 
        {
            cout << "Warning: doWork not implemented" << endl;
            return (A*)0;
        }
}

【讨论】:

  • ... 或者从技术上讲,cout 应该说 doWork() 没有被覆盖!
  • nullptr 没有演员会...更好吗?
  • @knivil - 当然,只要我们关注良好实践和风格的主题,但 nullptr 确实假定了最新版本的 C++。可以肯定的是,我投入的旧 C 风格演员是懒惰打字!
【解决方案2】:

我会说你的设计有缺陷,但你可以通过将类层次结构增加到类似的东西来解决它

class A
{
    ...
};

class A1 : public A
{
public:
    virtual A* doWork() = 0;
};

class A2 : public A
{
public:
    virtual void doWork() = 0;
};

class B : public A1
{
public:
    A* doWork() { ... }
};

class C : public A2
{
public:
    void doWork() { ... }
};

这仍然是一个糟糕的设计,但它应该允许您拥有不同的类来做不同的事情,但仍然继承自 A

当然,您不能指望多态性按预期工作,因为A 没有doWork 成员,相反,您需要将A 指针向下转换为B 或@987654327 @指针。

【讨论】:

    最近更新 更多