【发布时间】:2024-01-04 05:31:01
【问题描述】:
我希望如果foo 在类D 中声明,但没有标记为虚拟,那么下面的代码将调用D 中的foo 的实现(不管d 的动态类型如何) )。
D& d = ...;
d.foo();
但是,在下面的程序中,情况并非如此。谁能解释一下?如果方法覆盖了虚函数,它会自动为虚函数吗?
#include <iostream>
using namespace std;
class C {
public:
virtual void foo() { cout << "C" << endl; }
};
class D : public C {
public:
void foo() { cout << "D" << endl; }
};
class E : public D {
public:
void foo() { cout << "E" << endl; }
};
int main(int argc, char **argv)
{
E& e = *new E;
D& d = *static_cast<D*>(&e);
d.foo();
return 0;
}
上述程序的输出为:
E
【问题讨论】:
-
static_cast 是多余的 - 由于从 E*/E& 到 D*/D& 的隐式转换,
D& d = *static_cast<D*>(&e);等同于D& d = e;。 -
在 c++ 11 中,在函数声明中添加“覆盖”可以清楚地表明您打算覆盖基类函数。如果您声明的函数的 constness 与 base 不同,它还会触发编译器的错误(如果您从 std::exception 派生并声明 what() non-const,这可能会让您感到惊讶)
标签: c++ virtual overriding