我试图理解 C++ 中的一点。如果类 A 有一个非虚拟方法,而扩展 A 的类 B 覆盖该方法,我可以创建 B 的实例并以某种方式使用 B 中定义的方法吗?是否有必要覆盖非虚拟方法?
问问题
16002 次
4 回答
38
是否有必要覆盖非虚拟方法?
您实际上并没有压倒一切,但这是行为,即
B* b = new B();
A* a = new B();
b->method(); //Calls B's method
a->method(); // Calls A's method
因此,指针/引用类型决定了调用的方法。
我可以创建 B 的实例并以某种方式使用 B 中定义的方法吗?
是的。指针/引用类型必须是 B 类型。(参见前面的示例)。
如果你不声明method
是virtual
,你不能覆盖它,但你可以隐藏它。
于 2012-06-29T22:18:42.067 回答
13
如果B
继承自A
,并重新定义 中定义的方法A
,则 的新实例B
将调用B
的版本。但是,如果方法不是虚拟的,则不存在多态行为,因此如果将 的实例B
引用为A
,则该方法将是A
's。例如:
struct A {
void foo () { std::cout << "A::foo" << std::endl; }
};
struct B : public A {
void foo () { std::cout << "B::foo" << std::endl; }
};
B b;
b.foo();
A *a = &b;
a->foo();
上面代码的输出将是:
B::foo
A::foo
但是,如果该foo
方法是虚拟的,那么B::foo
将被打印两次。
于 2012-06-29T22:06:27.260 回答
4
如果一个函数不是virtual
,那么变量的类型也决定了哪个实现被分派:
#include <iostream>
using namespace std;
struct A {
void f() { cout << "A" << endl; }
};
struct B : public A {
void f() { cout << "B" << endl; }
};
int main(int args, char** argv) {
B b;
A& a = b;
b.f();
a.f();
return 0;
}
于 2012-06-29T22:06:57.070 回答
0
- 不,没有机制可以覆盖 A 类中的非虚拟方法。
- 是的,您可以通过使用范围解析运算符 A::methodName 来使用在 B 中重载的类 A 中的非虚拟方法
于 2012-06-29T22:10:53.320 回答