我可以使用覆盖非虚方法的方法吗?

时间:2012-06-29 22:00:21

标签: c++ polymorphism override

我试图在C ++中理解这一点。 如果A类具有非虚方法,而扩展A的B类覆盖该方法,我可以创建B的实例并以某种方式使用B中定义的方法吗? 是否有必要覆盖非虚方法?

4 个答案:

答案 0 :(得分:35)

  

是否有必要覆盖非虚方法?

你实际上并没有覆盖,但这就是行为,即

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,则无法覆盖,但您可以隐藏

答案 1 :(得分:12)

如果B继承自A,并重新定义A中定义的方法,则B的新实例将调用B&#39}版。但是,如果该方法不是虚拟的,则没有多态行为,因此如果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将被打印两次。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

  • 不,没有机制可以覆盖A类中的非虚方法。
  • 是的,您可以使用范围解析运算符A :: methodName
  • 在B中重载A类的非虚方法