我想在C++中理解这一点。 如果类A有一个非虚方法,并且扩展A的类B覆盖该方法,我可以创建B的一个实例并以某种方式使用B中定义的方法? 有没有必要重写一个非虚方法?我可以使用覆盖非虚方法的方法吗?
回答
是否有必要重写一个非虚方法?
你实际上并没有覆盖,但是这是行为,即
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
,你不能覆盖它,但你可以隐藏它。
很好的答案,谢谢 – Eyal
一个“gotcha”是当'A'反过来是从一些基类(或实现一个接口)派生'virtual method()',在这种情况下'a->方法()'实际上会调用'B.method()'... – BadCash
@Chip你错过了强调差异。这个答案只有BadCashs评论完成。 – ManuelSchneid3r
如果从A
B
继承,并重新定义了A
定义的方法,那么B
新实例将调用B
的版本。但是,如果该方法不是虚拟的,则不存在多态行为,因此如果B
的实例被引用为A
,则该方法将为A
。例如:
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
已打印的两倍。
写得很好! :) – niknak
如果函数不是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;
}
- 没有,没有机制来覆盖类A. 非虚拟方法
- 是的,则可以通过使用范围解析运营商A使用从A类B中过载的非虚拟方法::方法名
- 1. 覆盖非虚拟方法?
- 2. 如何覆盖非虚拟方法?
- 3. 可以覆盖类别方法吗? IOS
- 4. 可以覆盖jsp_service()方法吗?
- 5. C++虚拟方法覆盖
- 6. 使用虚拟覆盖方法签名
- 7. 我可以覆盖doPost方法的servlet的方法,多次
- 8. C#中有什么方法可以用扩展方法覆盖类方法吗?
- 9. 我可以防止继承的虚拟方法在子类中被覆盖吗?
- 10. C++用纯虚方法覆盖纯虚方法
- 11. 我可以用模块覆盖实例方法吗?
- 12. 我可以避免在以下情况下覆盖方法吗?
- 13. 我可以手动覆盖继承的方法吗?
- 14. 我可以检测到方法已被覆盖吗?
- 15. 我可以在继承中只覆盖一种方法吗?
- 16. 覆盖Object的虚拟方法
- 17. 覆盖合格的虚拟方法
- 18. 覆盖C++的虚拟方法
- 19. 你可以调用在Haxe中被覆盖的父方法吗?
- 20. 用转换方法覆盖虚拟方法
- 21. 虚拟函数可以被非虚函数覆盖吗?
- 22. 覆盖虚拟功能到非虚拟功能可以吗?
- 23. Java方法覆盖 - 在父级访问方法 - 这可能吗?
- 24. Java方法覆盖 - “方法不会覆盖超级方法...”
- 25. 覆盖方法
- 26. 覆盖方法
- 27. 覆盖方法
- 28. 覆盖方法
- 29. 覆盖'+'方法
- 30. 有什么方法可以自动覆盖NetBeans中的方法吗?
你所描述的称为*隐藏*,而不是覆盖。看看这里,例如:http://stackoverflow.com/questions/2161462/c-inheritance-and-function-overriding – jrok