gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:57:10 25 4
gpt4 key购买 nike

下面是一些旨在显示虚方法何时被覆盖的代码。它输出:乙乙AA乙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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com