在某些派生类中实现虚函数的正确方法是啥?

Posted

技术标签:

【中文标题】在某些派生类中实现虚函数的正确方法是啥?【英文标题】:What's the right way to implement virtual function in some derived classes?在某些派生类中实现虚函数的正确方法是什么? 【发布时间】:2016-03-08 16:01:40 【问题描述】:

我有一个抽象类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 【参考方案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 @指针。

【讨论】:

以上是关于在某些派生类中实现虚函数的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在派生类中实现类的基本函数

在派生构造函数中的某些代码块之后调用派生类中的基类构造函数[重复]

通过迭代基类向量在派生类中实现的调用方法

在python中实现类接口的正确方法是啥

派生类不从基类继承重载方法

实现基类比较的正确方法是啥?