以错误的方式调用子类中的函数的最佳方法是什么?

时间:2012-07-03 08:30:09

标签: c++ oop dynamic-cast

警告:请注意,这是一个愚蠢的问题,我可能永远不会以这种方式解决。因此矛盾的标题。但是因为我实际上已经在代码中看到了类似的东西,所以我在一个非常大的系统上经历过,所以我很感兴趣。 :)

假设我们有一个简化的类:

class Foo
{
  void a();
  virtual void b();
}

然后是另一个班级

class Bar : public Foo
{
  void a();
}

如果程序的一般部分将所有这些类作为类型Foo的基类处理,那么我如何以最佳方式在{{1}内调用函数a的“正确”版本}}?由于对象可能是b类型。 并且说,由于遗留原因,您无法更改现有代码并使基类成为虚拟等功能。

我所做的是在基类中使Bar虚拟,并在a内实现b,因为我有这个选项。但是,为了争论,让我们说这是不可能的或不允许的。使用类似的东西实现变通方法是多么“错误”。

Bar

正如我所说,请注意这是在处理基类并且想要调用子类的函数时。不是相反。

3 个答案:

答案 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派生到其他儿童班,将无法管理。