在某些派生类中实现虚函数的正确方法是什么?
问题描述:
我有一个抽象类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.
}
}
我试图把一个错误,但是这不是我想做的事情。
有没有更好的方法来做到这一点?
答
一个选项,假设你有控制权,挑战做A类抽象的前提:不要让类A抽象并在那里实现默认函数。你必须返回一些东西,但它可能是一个空指针。 A类函数的输出将表明该函数尚未实现,这是准确的。
class A
{
public:
virtual A* doWork()
{
cout << "Warning: doWork not implemented" << endl;
return (A*)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
指针你必须向下转换B
或C
指针。
如果调用者可以处理null,你可以打印警告并返回null。 – whd
'B ::'不应该出现在'B'中。 'C'一样。它是'class',而不是'Class'。 – Biffen