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

时间:2016-03-08 16:01:40

标签: c++ oop c++11

我有一个抽象类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;
  }
}

在课程doWork()中致电C时,我想要的是打印一些文字,说明此功能未在此处实施。

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

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

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我会说你的设计存在缺陷,但你可以通过将类层次结构增加到类似

来解决它
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指针你需要BC指针。