1

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

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

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

然后是另一堂课

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

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

我所做的是a在基类中创建虚拟并b在内部实现,Bar因为我有这个选项。但是,为了争论,让我们说这是不可能的或不允许的。使用这样的方法实施解决方法会有多“错误”。

void b() {
  ...

  Bar* dabar;
  if((dabar = dynamic_cast<Bar*>(this)) != NULL) {
    dabar->a();
  }
  else {
    a();
  }
}

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

4

3 回答 3

2

如果有可能在基类中使您的函数虚拟化,那么这是可行的方法,包括调用不同的公司来更改那里的代码的开销,因为这显然是一个设计缺陷。

如果您没有这种可能性,无论出于何种原因,您的代码都可以工作,除非您想从 Bar 派生。当您拥有一个 Bar* 并在其上调用“a”时,您认为会发生什么。

像:

Chair : public Bar {...}

Bar *bar = new Chair;
bar->a();
// what the heck?

而且,当然,dynamic_cast 会严重影响性能。

写干净的代码,写你想表达的,不要使用技巧!

于 2012-07-03T09:03:40.477 回答
1

使用这样的方法实施解决方法会有多“错误”。

void b() {
  ...

  Bar* dabar;
  if((dabar = dynamic_cast<Bar*>(this)) != NULL) {
    dabar->a();
  }
  else {
    a();
  }
}

那将是矫枉过正。只需在虚函数中调用 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
于 2012-07-03T08:48:12.057 回答
0

使用这样的方法实施解决方法会有多“错误”。

理论上你没有做错任何事。这是一个定义明确的行为。

只是,这不是一个好习惯。它使代码混乱和混乱。此外,如果将来派生到其他一些子类
,它将无法管理。bar

于 2012-07-03T08:40:26.060 回答