c++ - 覆盖非虚拟方法?

标签 c++ inheritance virtual

下面是一些旨在显示虚方法何时被覆盖的代码。它输出: 乙 乙 A A 乙 A 它是否正确?我认为 bar 方法不能被覆盖...?

#include <iostream>
using namespace std;


class A
{
public:
    virtual void foo(){cout<<"A"<<endl;}
            void bar(){cout<<"A"<<endl;}
};

class B : public A
{
public:
    void foo(){cout<<"B"<<endl;}
    void bar(){cout<<"B"<<endl;}
};

int main()
{
    B b;
    A * pA = new A;
    A * pA2 = &b;
    b.foo(); b.bar();
    pA->foo(); pA->bar();
    pA2->foo(); pA2->bar();

}    

最佳答案

我没有看到任何错误:

B b;
b.foo(); b.bar();

你声明并初始化了一个B的实例,编译类型是B,运行时类型是B。不需要多态性(也无法实现,因为不涉及指针)。

A * pA = new A;
pA->foo(); pA->bar();

您声明一个指向A 的指针并使用A 的实例对其进行初始化。即使在这种情况下不需要多态性,但它仍然有效,因此调用了 A 中的 foo()bar()

A * pA2 = &b;
pA2->foo(); pA2->bar();

您声明一个指向A 的指针并使用对B 的引用对其进行初始化。编译时类型为A*,运行时类型为B*。通过虚函数应用多态性,所以虚方法是 B::foo() 而非虚方法是 A::bar()

关于c++ - 覆盖非虚拟方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19107006/

相关文章:

c++ - 准确计算编译器在结构中添加的填充

c++ - 我无法在基于 C 的代理中显示图像

java - 当无法通过 JNI 加载 JVM 时如何获得错误消息?

c++ - 在 Python 中扩展的 C++ 类中的段错误回调问题

去虚函数模拟

c++ - 隐式虚拟性传播的原因是什么?

c++ - 无法读取文件进行文件处理,使用boost库获取文件路径

inheritance - Golang 和继承

c# - 将具体的 Task<TImplementation> 分配给 Task<TInterface> 类型的变量

python - 如何避免使用 Python 继承重新定义默认参数