这很可能是一个愚蠢的问题,但我似乎无法弄清楚这是否完全可能,以及是否应该实际完成。
说一些代码在很大程度上取决于使用某个虚拟基类作为接口,然后派生几个实现该虚拟方法的基类的子类。当程序的其余部分除了基类“接口”之外什么都看不到时,是否可以使用下面基类(接口)中不存在的功能,而无需完全忽略扎实的原则?像下面的示例一样,是否可以在仅知道A的函数中使用B类中的bar()?我应该只将bar()添加到“接口”吗?
// 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;
}
答案 0 :(得分:1)
简短的答案是肯定的,请使用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
将提供一些明智的默认实现)。另一种方法可能是创建一个新接口来容纳bar
方法,并使您的函数接受该类型的对象。 (B
类将实现A
和新接口。)