在没有virtual关键字的情况下实现虚函数

时间:2013-11-29 17:27:14

标签: c++ inheritance virtual-functions

我的问题如下:

我希望(如果可能的话)“实现”虚拟函数而不使用“virtual”关键字(出于好奇 - 我知道C中函数指针的技巧,我希望在C ++中这样做!!)。 我的“想法”是有一个标志,它将在构造函数中分配,以指示该对象是哪个实例。 我的问题是: 1)甚至可能吗? 2)如果是这样 - 我做错了什么?或者缺少什么?

我正在使用g ++,这给了我这些错误:

#‘B’ has not been declared

#‘C’ has not been declared

#class ‘B’ does not have any field named ‘flag’

#class ‘C’ does not have any field named ‘flag’

这是我的建议:

#include <iostream>
using namespace std;

class A {

protected:
    short flag;
public:
   A(int f = 1) : flag(f) {}
   void foo() 
   {
      switch (this->flag)
     {
        case 1: cout << "A " << endl; break;

        case 2: B :: foo(); break;

        case 3: C :: foo(); break;
     }
   }
};

class B : public A{

public:
B(int f = 2) : A(f) {}
void foo() {cout << "B " << endl;}
};


class C : public B{

 public:
   C(int f = 3) : B(f) {}
   void foo() {cout << "C " << endl;}
};

int main()
{
  A a;
  B b;
  C c;

  A *pb = &b;
  A *pc = &c;

  a.foo();
  pb->foo();
  pc->foo();

  return 0;
} // end main   

提前感谢分配(!!),盖伊。

1 个答案:

答案 0 :(得分:1)

  

甚至可能吗?

是。这可能不太明智,因为它比虚函数更容易出错,并且要求基类知道所有派生类,但它肯定是可能的,而且你几乎就在那里。

  

如果是这样 - 我做错了什么?

您需要在A::fooB的定义之后将C的定义移出类,以便它可以使用这些类。

您需要显式向下转换才能访问派生类的成员函数:

static_cast<B*>(this)->foo();