这很可能是一个愚蠢的问题,但我似乎无法弄清楚这是否完全可能以及是否应该实际完成。
说一些代码在很大程度上依赖于使用某个虚拟基类作为接口(interface),然后派生几个实现基类虚拟方法的子类。当程序的其余部分只能看到基类“接口(interface)”时,是否可以使用下面基类(接口(interface))中不存在的功能而不完全无视坚实的原则?就像下面的例子一样,是否可以在只知道 A 的函数中使用 B 类中的 bar() ?我应该只将 bar() 添加到“接口(interface)”吗?
// Base class - "interface"
Class A
{
public:
virtual int foo();
}
// Derived class - implementing the "interface" + more
Class B: public A
{
public:
int foo();
int bar();
}
int main()
{
function(A); // Some magic function that would utlize the bar() method
return 0;
}
最佳答案
简短的回答是肯定的,使用 dynamic_cast
运算符(但见下文)。魔法函数看起来像这样:
void function(A& a)
{
B* b = dynamic_cast<B*>(&a);
if (b)
{
// Object is a B...
b->bar();
}
else
{
// fallback logic using only methods on A
}
}
但请注意,许多程序员认为这是一种代码味道。特别是,如果没有办法实现“回退”分支,那么它表明函数应该真正接受 B
并且设计中的某些地方可能有问题。 (然而,在如此笼统地谈论时很难说。)还要注意 dynamic_cast
可能很昂贵,尤其是对于复杂的类层次结构。
如果合理的话,最好以某种方式将特定于B
的逻辑移动到B
类中。您还可以考虑使 bar
方法成为 A
类的成员(A
将提供一些合理的默认实现)。另一种方法可能是创建一个新接口(interface)来保存 bar
方法,并让您的函数接受该类型的对象。 (B
类将实现 A
和新接口(interface)。)
关于c++ - 如何使用派生类中的函数而不将它们添加到基类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999717/