我的问题如下:
我希望(如果可能的话)“实现”虚拟函数而不使用“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
提前感谢分配(!!),盖伊。
答案 0 :(得分:1)
甚至可能吗?
是。这可能不太明智,因为它比虚函数更容易出错,并且要求基类知道所有派生类,但它肯定是可能的,而且你几乎就在那里。
如果是这样 - 我做错了什么?
您需要在A::foo
和B
的定义之后将C
的定义移出类,以便它可以使用这些类。
您需要显式向下转换才能访问派生类的成员函数:
static_cast<B*>(this)->foo();