我试图理解C ++中“virtual”关键字的功能 - 考虑这个例子:
#ifdef USE_VIRTUAL
struct a {
virtual void say_hi() { std::cout << "hello from a" << std::endl; }
};
#else
struct a {
void say_hi() { std::cout << "hello from a" << std::endl; }
};
#endif
struct b : public a {
void say_hi() { std::cout << "hello from b" << std::endl; }
};
int main( int argc, char** argc )
{
a a_obj;
b b_obj;
a_obj.say_hi();
b_obj.say_hi();
}
该程序输出:
hello from a
hello from b
无论:: say_hi是否被声明为虚拟。由于即使say_hi未声明为虚拟,函数也会被正确覆盖,那么将其声明为虚拟的功能是什么?
答案 0 :(得分:6)
您没有使用多态性。多态行为只会影响指针和对基类的引用,如下所示:
class A; class B1 : A; class B2 : A;
B1 x;
B2 y;
A z;
A & a1 = x; // static type A&, dynamic type B1&
A & a2 = y; // static type A&, dynamic type B2&
A & a3 = z; // static and dynamic type A&
现在访问a1
的成员函数,a2
,a3
受多态和虚拟调度影响。
但是,您必须在继承层次结构虚拟的顶部声明第一个函数,即在A
中!在您的示例中,没有virtual
,没有多态,您始终调用对象的相应静态类型的成员函数。要测试这一点,请添加另外几行:
a & bref = b_obj;
bref.say_hi(); // call b::say_hi() if virtual, a::say_hi if not
bref.a::say_hi(); // always call a::say_hi()