在某些派生类中实现虚函数的正确方法是啥?
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 @指针。
【讨论】:
以上是关于在某些派生类中实现虚函数的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章