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

Eya*_*yal 14 c++ polymorphism overriding

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

Chi*_*hip 35

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

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

B* b = new B();
A* a = new B();
b->method(); //Calls B's method
a->method(); // Calls A's method
Run Code Online (Sandbox Code Playgroud)

因此,指针/引用类型确定调用的方法.

我可以创建一个B的实例,并以某种方式使用B中定义的方法?

是.指针/引用类型必须是B类型(参见前面的例子).

如果不申报methodvirtual,你不能忽略它,但你可以隐藏它.


jxh*_*jxh 12

如果B继承自A并重新定义了一个定义的方法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();
Run Code Online (Sandbox Code Playgroud)

上面代码的输出将是:

B::foo
A::foo
Run Code Online (Sandbox Code Playgroud)

但是,如果该foo方法是虚拟的,则会B::foo打印两次.