警告:请注意,这是一个愚蠢的问题,我可能永远不会以这种方式解决。因此矛盾的标题。但是因为我实际上已经在代码中看到了类似的东西,所以我在一个非常大的系统上经历过,所以我很感兴趣。 :)
假设我们有一个简化的类:
class Foo
{
void a();
virtual void b();
}
然后是另一个班级
class Bar : public Foo
{
void a();
}
如果程序的一般部分将所有这些类作为类型Foo
的基类处理,那么我如何以最佳方式在{{1}内调用函数a
的“正确”版本}}?由于对象可能是b
类型。
并且说,由于遗留原因,您无法更改现有代码并使基类成为虚拟等功能。
我所做的是在基类中使Bar
虚拟,并在a
内实现b
,因为我有这个选项。但是,为了争论,让我们说这是不可能的或不允许的。使用类似的东西实现变通方法是多么“错误”。
Bar
正如我所说,请注意这是在处理基类并且想要调用子类的函数时。不是相反。
答案 0 :(得分:2)
如果有可能在基类中使您的函数成为虚拟的, 这是要走的路,包括打电话给另一家公司的开销 改变代码,因为这显然是一个设计缺陷。
如果你没有这种可能性,出于什么原因, 您的代码将起作用,除非您想从Bar派生。 当你有一个Bar *并在其上调用“a”时,你认为会发生什么呢?
像:
Chair : public Bar {...}
Bar *bar = new Chair;
bar->a();
// what the heck?
当然,dynamic_cast意味着对性能的严重劣势。
写清洁代码,写下你要表达的内容,不要使用技巧!
答案 1 :(得分:1)
使用类似的东西实现变通方法是多么“错误” 此
void b() { ... Bar* dabar; if((dabar = dynamic_cast<Bar*>(this)) != NULL) { dabar->a(); } else { a(); } }
那将是一种矫枉过正。 只需在虚函数中调用()即可。
#include <iostream>
class Base
{
public:
virtual int tryit()
{
return foo();
}
private:
int foo(){ return 1; }
};
class Derived: public Base
{
public:
virtual int tryit()
{
return foo();
}
private:
int foo(){ return 2; }
};
int main()
{
Base *A = new Derived();
std::cout << std::endl << A->tryit();
}
输出:
2
答案 2 :(得分:0)
使用类似的东西实现变通方法是多么“错误” 此
从理论上讲,你没有做错任何事。这是一个明确定义的行为。
就是这样,不是一个好的做法可以遵循。它使代码混乱和混乱
而且,如果将来bar
派生到其他儿童班,将无法管理。