我正在处理一些遗留代码,我想知道哪种解决方案更好。 这是我的情况。有一个基类和许多(多级)派生类。
class Base
{};
class DerivedA1: public Base
{};
class DerivedA2: public Base
{};
class DerivedB1: public DerivedA1
{};
...
class DerivedXn: public DerivedS8
{
void CheckSomething();
};
DerivedXn是我需要添加的新类,我必须提供一个函数CheckSomething()。现在出现了问题。在main函数中我只得到一个指向Base类的指针,所以最好在类Base中使用空实现声明CheckSomething()是虚拟的,还是使用指向DerivedXn类的指针dynamic_cast?
//solution 1
class Base
{
virtual void CheckSomething(){}
};
class DerivedXn: public DerivedS8
{
virtual void CheckSomething()
{
//do something
}
};
main()
{
Base *p = FromSomewhere();
p->CheckSomething();
}
//solution 2
main()
{
Base *p = FromSomewhere();
DerivedXn *pd = dynamic_cast<DerivedXn*>(p);
if(pd)
pd->CheckSomething();
}
对于解决方案1,我担心它会破坏旧类的结构(即使新的虚函数什么都不做),因为CheckSomething()对于某些派生类来说是没有意义的。 对于解决方案2,我担心dynamic_cast需要花费太多时间。
从更好的角度来说,我的意思是干净,高效和结构良好的代码方式。如果你有其他好主意,那也很棒。
提前致谢。
PS:类Base中已经有一些其他虚函数,所以使用dynamic_cast不是问题。