2016-03-08 84 views
0

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

我试图把一个错误,但是这不是我想做的事情。

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

+1

如果调用者可以处理null,你可以打印警告并返回null。 – whd

+1

'B ::'不应该出现在'B'中。 'C'一样。它是'class',而不是'Class'。 – Biffen

回答

0

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

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

......或者从技术上讲,cout应该说doWork()不会被覆盖! – CarlH

+0

'nullptr'没有演员会更好? – knivil

+0

@knivil - 当然,只要我们谈论良好的实践和风格,但是nullptr的确假设了最新版本的C++。可以肯定的是,我投入的旧C风格演员是懒惰的打字! – CarlH

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指针。

相关问题