C++ 中的动态绑定
Posted
技术标签:
【中文标题】C++ 中的动态绑定【英文标题】:Dynamic Binding in C++ 【发布时间】:2009-06-23 06:33:22 【问题描述】:为什么派生类必须将其方法声明为虚拟才能使动态绑定起作用,即使基类的方法被声明为虚拟?
【问题讨论】:
【参考方案1】:没必要。如果一个方法在基类中声明为虚拟,则在派生类中覆盖它也会使覆盖函数成为虚拟,即使没有使用 virtual
关键字。
【讨论】:
【参考方案2】:它没有。
class Base
virtual void foo()
;
class Derived : public Base
void foo()
在这段代码中,foo()
在Derived
类中仍然是虚拟的,即使它没有被声明为这样。
【讨论】:
【参考方案3】:是吗?以下代码产生预期的输出 B::f1()(使用 VS2008 编译):
class A
public:
virtual ~A()
virtual void f1()
std::cout<<"A::f1()\n";
virtual void f2()
std::cout<<"A::f2()\n";
;
class B : public A
public:
void f1()
std::cout<<"B::f1()\n";
void f2()
std::cout<<"B::f2()\n";
;
int main()
B b;
A* p = &b;
p->f1();
return 0;
【讨论】:
感谢您的回答,帮了大忙。【参考方案4】:引用 C++ 标准 (10.3.2):
如果在类
Base
和类Derived
中声明一个虚成员函数vf
,直接或间接派生自Base
,则成员函数vf
具有相同的名称和相同的参数列表当Base::vf
被声明时,Derived::vf
也是虚拟的(无论它是否被声明)并且它覆盖Base::vf
。
您可以总结为:“一次虚拟,永远虚拟”。但是,您仍然可以将 virtual
修饰符添加到覆盖的成员函数中,以便让用户清楚该类是多态的。
【讨论】:
【参考方案5】:不需要。 但我也更喜欢在派生类函数中使用 virtual,因为它会使与这些函数关联的动态绑定在阅读代码时更加清晰。
【讨论】:
以上是关于C++ 中的动态绑定的主要内容,如果未能解决你的问题,请参考以下文章