我有一个抽象类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.
}
}
我试图抛出错误,但这不是我想要做的。
有更好的方法吗?
答案 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
指针你需要B
或C
指针。